Rev 1892 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1892 | Rev 3959 | ||
---|---|---|---|
Line 43... | Line 43... | ||
43 | 43 | ||
44 | typedef struct _cairo_list { |
44 | typedef struct _cairo_list { |
45 | struct _cairo_list *next, *prev; |
45 | struct _cairo_list *next, *prev; |
Line 46... | Line -... | ||
46 | } cairo_list_t; |
- | |
47 | - | ||
48 | #define cairo_list_entry(ptr, type, member) \ |
- | |
49 | cairo_container_of(ptr, type, member) |
- | |
50 | - | ||
51 | #define cairo_list_first_entry(ptr, type, member) \ |
- | |
52 | cairo_list_entry((ptr)->next, type, member) |
- | |
53 | - | ||
54 | #define cairo_list_last_entry(ptr, type, member) \ |
- | |
55 | cairo_list_entry((ptr)->prev, type, member) |
- | |
56 | - | ||
57 | #define cairo_list_foreach(pos, head) \ |
- | |
58 | for (pos = (head)->next; pos != (head); pos = pos->next) |
- | |
59 | - | ||
60 | #define cairo_list_foreach_entry(pos, type, head, member) \ |
- | |
61 | for (pos = cairo_list_entry((head)->next, type, member);\ |
- | |
62 | &pos->member != (head); \ |
- | |
63 | pos = cairo_list_entry(pos->member.next, type, member)) |
- | |
64 | - | ||
65 | #define cairo_list_foreach_entry_safe(pos, n, type, head, member) \ |
- | |
66 | for (pos = cairo_list_entry ((head)->next, type, member),\ |
- | |
67 | n = cairo_list_entry (pos->member.next, type, member);\ |
- | |
68 | &pos->member != (head); \ |
- | |
69 | pos = n, n = cairo_list_entry (n->member.next, type, member)) |
- | |
70 | - | ||
71 | #define cairo_list_foreach_entry_reverse(pos, type, head, member) \ |
- | |
72 | for (pos = cairo_list_entry((head)->prev, type, member);\ |
- | |
73 | &pos->member != (head); \ |
- | |
74 | pos = cairo_list_entry(pos->member.prev, type, member)) |
- | |
75 | - | ||
76 | #define cairo_list_foreach_entry_reverse_safe(pos, n, type, head, member) \ |
- | |
77 | for (pos = cairo_list_entry((head)->prev, type, member),\ |
- | |
78 | n = cairo_list_entry (pos->member.prev, type, member);\ |
- | |
79 | &pos->member != (head); \ |
- | |
80 | pos = n, n = cairo_list_entry (n->member.prev, type, member)) |
- | |
81 | - | ||
82 | #ifdef CAIRO_LIST_DEBUG |
- | |
83 | static inline void |
- | |
84 | _cairo_list_validate (const cairo_list_t *link) |
- | |
85 | { |
- | |
86 | assert (link->next->prev == link); |
- | |
87 | assert (link->prev->next == link); |
- | |
88 | } |
- | |
89 | static inline void |
- | |
90 | cairo_list_validate (const cairo_list_t *head) |
- | |
91 | { |
- | |
92 | cairo_list_t *link; |
- | |
93 | - | ||
94 | cairo_list_foreach (link, head) |
- | |
95 | _cairo_list_validate (link); |
- | |
96 | } |
- | |
97 | static inline cairo_bool_t |
- | |
98 | cairo_list_is_empty (const cairo_list_t *head); |
- | |
99 | static inline void |
- | |
100 | cairo_list_validate_is_empty (const cairo_list_t *head) |
- | |
101 | { |
- | |
102 | assert (head->next == NULL || (cairo_list_is_empty (head) && head->next == head->prev)); |
- | |
103 | } |
- | |
104 | #else |
- | |
105 | #define _cairo_list_validate(link) |
- | |
106 | #define cairo_list_validate(head) |
- | |
107 | #define cairo_list_validate_is_empty(head) |
- | |
108 | #endif |
- | |
109 | - | ||
110 | static inline void |
- | |
111 | cairo_list_init (cairo_list_t *entry) |
- | |
112 | { |
- | |
113 | entry->next = entry; |
- | |
114 | entry->prev = entry; |
- | |
115 | } |
- | |
116 | - | ||
117 | static inline void |
- | |
118 | __cairo_list_add (cairo_list_t *entry, |
- | |
119 | cairo_list_t *prev, |
- | |
120 | cairo_list_t *next) |
- | |
121 | { |
- | |
122 | next->prev = entry; |
- | |
123 | entry->next = next; |
- | |
124 | entry->prev = prev; |
- | |
125 | prev->next = entry; |
- | |
126 | } |
- | |
127 | - | ||
128 | static inline void |
- | |
129 | cairo_list_add (cairo_list_t *entry, cairo_list_t *head) |
- | |
130 | { |
- | |
131 | cairo_list_validate (head); |
- | |
132 | cairo_list_validate_is_empty (entry); |
- | |
133 | __cairo_list_add (entry, head, head->next); |
- | |
134 | cairo_list_validate (head); |
- | |
135 | } |
- | |
136 | - | ||
137 | static inline void |
- | |
138 | cairo_list_add_tail (cairo_list_t *entry, cairo_list_t *head) |
- | |
139 | { |
- | |
140 | cairo_list_validate (head); |
- | |
141 | cairo_list_validate_is_empty (entry); |
- | |
142 | __cairo_list_add (entry, head->prev, head); |
- | |
143 | cairo_list_validate (head); |
- | |
144 | } |
- | |
145 | - | ||
146 | static inline void |
- | |
147 | __cairo_list_del (cairo_list_t *prev, cairo_list_t *next) |
- | |
148 | { |
- | |
149 | next->prev = prev; |
- | |
150 | prev->next = next; |
- | |
151 | } |
- | |
152 | - | ||
153 | static inline void |
- | |
154 | cairo_list_del (cairo_list_t *entry) |
- | |
155 | { |
- | |
156 | __cairo_list_del (entry->prev, entry->next); |
- | |
157 | cairo_list_init (entry); |
- | |
158 | } |
- | |
159 | - | ||
160 | static inline void |
- | |
161 | cairo_list_move (cairo_list_t *entry, cairo_list_t *head) |
- | |
162 | { |
- | |
163 | cairo_list_validate (head); |
- | |
164 | __cairo_list_del (entry->prev, entry->next); |
- | |
165 | __cairo_list_add (entry, head, head->next); |
- | |
166 | cairo_list_validate (head); |
- | |
167 | } |
- | |
168 | - | ||
169 | static inline void |
- | |
170 | cairo_list_move_tail (cairo_list_t *entry, cairo_list_t *head) |
- | |
171 | { |
- | |
172 | cairo_list_validate (head); |
- | |
173 | __cairo_list_del (entry->prev, entry->next); |
- | |
174 | __cairo_list_add (entry, head->prev, head); |
- | |
175 | cairo_list_validate (head); |
- | |
176 | } |
- | |
177 | - | ||
178 | static inline void |
- | |
179 | cairo_list_swap (cairo_list_t *entry, cairo_list_t *other) |
- | |
180 | { |
- | |
181 | __cairo_list_add (entry, other->prev, other->next); |
- | |
182 | cairo_list_init (other); |
- | |
183 | } |
- | |
184 | - | ||
185 | static inline cairo_bool_t |
- | |
186 | cairo_list_is_first (const cairo_list_t *entry, |
- | |
187 | const cairo_list_t *head) |
- | |
188 | { |
- | |
189 | cairo_list_validate (head); |
- | |
190 | return entry->prev == head; |
- | |
191 | } |
- | |
192 | - | ||
193 | static inline cairo_bool_t |
- | |
194 | cairo_list_is_last (const cairo_list_t *entry, |
- | |
195 | const cairo_list_t *head) |
- | |
196 | { |
- | |
197 | cairo_list_validate (head); |
- | |
198 | return entry->next == head; |
- | |
199 | } |
- | |
200 | - | ||
201 | static inline cairo_bool_t |
- | |
202 | cairo_list_is_empty (const cairo_list_t *head) |
- | |
203 | { |
- | |
204 | cairo_list_validate (head); |
- | |
205 | return head->next == head; |
- | |
206 | } |
- | |
207 | - | ||
208 | static inline cairo_bool_t |
- | |
209 | cairo_list_is_singular (const cairo_list_t *head) |
- | |
210 | { |
- | |
211 | cairo_list_validate (head); |
- | |
212 | return head->next == head || head->next == head->prev; |
- | |
213 | } |
46 | } cairo_list_t; |