xt-sdk 文档 v1.0.3
xt-sdk 嵌入式 SDK API 参考
载入中...
搜索中...
未找到
xt_list.h
浏览该文件的文档.
1
12
13#ifndef __XT_LIST_H__
14#define __XT_LIST_H__
15
16#include <stddef.h>
17#include <stdint.h>
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
29
36};
37
43};
44
49#define xt_container_of(ptr, type, member) \
50 ((type *)((char *)(ptr) - (uintptr_t)(&((type *)0)->member)))
51
55#define XT_LIST_OBJECT_INIT(object) { &(object), &(object) }
56
62static inline void xt_list_init(struct xt_list_node *l)
63{
64 l->next = l->prev = l;
65}
66
73static inline void xt_list_insert_after(struct xt_list_node *l, struct xt_list_node *n)
74{
75 l->next->prev = n;
76 n->next = l->next;
77
78 l->next = n;
79 n->prev = l;
80}
81
88static inline void xt_list_insert_before(struct xt_list_node *l, struct xt_list_node *n)
89{
90 l->prev->next = n;
91 n->prev = l->prev;
92
93 l->prev = n;
94 n->next = l;
95}
96
101static inline void xt_list_remove(struct xt_list_node *n)
102{
103 n->next->prev = n->prev;
104 n->prev->next = n->next;
105
106 n->next = n->prev = n;
107}
108
113static inline int xt_list_isempty(const struct xt_list_node *l)
114{
115 return l->next == l;
116}
117
122static inline unsigned int xt_list_len(const struct xt_list_node *l)
123{
124 unsigned int len = 0;
125 const struct xt_list_node *p = l;
126 while (p->next != l) {
127 p = p->next;
128 len ++;
129 }
130
131 return len;
132}
133
140#define xt_list_entry(node, type, member) \
141 xt_container_of(node, type, member)
142
148#define xt_list_for_each(pos, head) \
149 for (pos = (head)->next; pos != (head); pos = pos->next)
150
157#define xt_list_for_each_safe(pos, n, head) \
158 for (pos = (head)->next, n = pos->next; pos != (head); \
159 pos = n, n = pos->next)
160
167#define xt_list_for_each_entry(pos, head, member) \
168 for (pos = xt_list_entry((head)->next, typeof(*pos), member); \
169 &pos->member != (head); \
170 pos = xt_list_entry(pos->member.next, typeof(*pos), member))
171
179#define xt_list_for_each_entry_safe(pos, n, head, member) \
180 for (pos = xt_list_entry((head)->next, typeof(*pos), member), \
181 n = xt_list_entry(pos->member.next, typeof(*pos), member); \
182 &pos->member != (head); \
183 pos = n, n = xt_list_entry(n->member.next, typeof(*n), member))
184
193#define xt_list_first_entry(ptr, type, member) \
194 xt_list_entry((ptr)->next, type, member)
195
196#define XT_SLIST_OBJECT_INIT(object) { NULL }
197
203static inline void xt_slist_init(struct xt_slist_node *l)
204{
205 l->next = NULL;
206}
207
208static inline void xt_slist_append(struct xt_slist_node *l, struct xt_slist_node *n)
209{
210 struct xt_slist_node *node;
211
212 node = l;
213 while (node->next) {
214 node = node->next;
215 }
216
217 /* append the node to the tail */
218 node->next = n;
219 n->next = NULL;
220}
221
222static inline void xt_slist_insert(struct xt_slist_node *l, struct xt_slist_node *n)
223{
224 n->next = l->next;
225 l->next = n;
226}
227
228static inline unsigned int xt_slist_len(const struct xt_slist_node *l)
229{
230 unsigned int len = 0;
231 const struct xt_slist_node *list = l->next;
232 while (list != NULL) {
233 list = list->next;
234 len ++;
235 }
236
237 return len;
238}
239
240static inline struct xt_slist_node *xt_slist_remove(struct xt_slist_node *l, struct xt_slist_node *n)
241{
242 /* remove slist head */
243 struct xt_slist_node *node = l;
244 while (node->next && node->next != n) {
245 node = node->next;
246 }
247
248 /* remove node */
249 if (node->next != (struct xt_slist_node *)0) {
250 node->next = node->next->next;
251 }
252
253 return l;
254}
255
256static inline struct xt_slist_node *xt_slist_first(struct xt_slist_node *l)
257{
258 return l->next;
259}
260
261static inline struct xt_slist_node *xt_slist_tail(struct xt_slist_node *l)
262{
263 while (l->next) {
264 l = l->next;
265 }
266
267 return l;
268}
269
270static inline struct xt_slist_node *xt_slist_next(struct xt_slist_node *n)
271{
272 return n->next;
273}
274
275static inline int xt_slist_isempty(struct xt_slist_node *l)
276{
277 return l->next == NULL;
278}
279
286#define xt_slist_entry(node, type, member) \
287 xt_container_of(node, type, member)
288
294#define xt_slist_for_each(pos, head) \
295 for (pos = (head)->next; pos != NULL; pos = pos->next)
296
303#define xt_slist_for_each_entry(pos, head, member) \
304 for (pos = xt_slist_entry((head)->next, typeof(*pos), member); \
305 &pos->member != (NULL); \
306 pos = xt_slist_entry(pos->member.next, typeof(*pos), member))
307
316#define xt_slist_first_entry(ptr, type, member) \
317 xt_slist_entry((ptr)->next, type, member)
318
327#define xt_slist_tail_entry(ptr, type, member) \
328 xt_slist_entry(xt_slist_tail(ptr), type, member)
329 /* xt_list */
331
332#ifdef __cplusplus
333} /* extern "C" */
334#endif
335
336#endif /* __XT_LIST_H__ */
static unsigned int xt_list_len(const struct xt_list_node *l)
get the list length
static struct xt_slist_node * xt_slist_first(struct xt_slist_node *l)
static void xt_list_init(struct xt_list_node *l)
initialize a list
static void xt_list_remove(struct xt_list_node *n)
remove node from list.
static void xt_list_insert_before(struct xt_list_node *l, struct xt_list_node *n)
insert a node before a list
static struct xt_slist_node * xt_slist_tail(struct xt_slist_node *l)
static void xt_slist_insert(struct xt_slist_node *l, struct xt_slist_node *n)
static unsigned int xt_slist_len(const struct xt_slist_node *l)
static void xt_list_insert_after(struct xt_list_node *l, struct xt_list_node *n)
insert a node after a list
static struct xt_slist_node * xt_slist_next(struct xt_slist_node *n)
static void xt_slist_init(struct xt_slist_node *l)
initialize a single list
static void xt_slist_append(struct xt_slist_node *l, struct xt_slist_node *n)
static int xt_slist_isempty(struct xt_slist_node *l)
static int xt_list_isempty(const struct xt_list_node *l)
tests whether a list is empty
static struct xt_slist_node * xt_slist_remove(struct xt_slist_node *l, struct xt_slist_node *n)
struct xt_list_node * prev
struct xt_list_node * next
struct xt_slist_node * next