Bouffalo SDK  1.0
Bouffalolab Software Development Kit
bflb_list.h
Go to the documentation of this file.
1 
22 #ifndef _BFLB_LIST_H
23 #define _BFLB_LIST_H
24 
25 #include "string.h"
26 #include "stdint.h"
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
36 #define bflb_container_of(ptr, type, member) \
37  ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))
38 
45 };
46 typedef struct bflb_dlist_node bflb_dlist_t;
53 static inline void bflb_dlist_init(bflb_dlist_t *l)
54 {
55  l->next = l->prev = l;
56 }
57 
65 {
66  l->next->prev = n;
67  n->next = l->next;
68 
69  l->next = n;
70  n->prev = l;
71 }
72 
80 {
81  l->prev->next = n;
82  n->prev = l->prev;
83 
84  l->prev = n;
85  n->next = l;
86 }
87 
92 static inline void bflb_dlist_remove(bflb_dlist_t *n)
93 {
94  n->next->prev = n->prev;
95  n->prev->next = n->next;
96 
97  n->next = n->prev = n;
98 }
99 
105 {
108 }
109 
115 {
118 }
119 
124 static inline int bflb_dlist_isempty(const bflb_dlist_t *l)
125 {
126  return l->next == l;
127 }
128 
133 static inline unsigned int bflb_dlist_len(const bflb_dlist_t *l)
134 {
135  unsigned int len = 0;
136  const bflb_dlist_t *p = l;
137 
138  while (p->next != l) {
139  p = p->next;
140  len++;
141  }
142 
143  return len;
144 }
145 
149 #define DLIST_OBJECT_INIT(object) \
150  { \
151  &(object), &(object) \
152  }
153 
156 #define DLIST_DEFINE(list) \
157  bflb_dlist_t list = { &(list), &(list) }
158 
165 #define bflb_dlist_entry(node, type, member) \
166  bflb_container_of(node, type, member)
167 
176 #define bflb_dlist_first_entry(ptr, type, member) \
177  bflb_dlist_entry((ptr)->next, type, member)
178 
186 #define bflb_dlist_first_entry_or_null(ptr, type, member) \
187  (bflb_dlist_isempty(ptr) ? NULL : bflb_dlist_first_entry(ptr, type, member))
188 
194 #define bflb_dlist_for_each(pos, head) \
195  for (pos = (head)->next; pos != (head); pos = pos->next)
196 
202 #define bflb_dlist_for_each_prev(pos, head) \
203  for (pos = (head)->prev; pos != (head); pos = pos->prev)
204 
211 #define bflb_dlist_for_each_safe(pos, n, head) \
212  for (pos = (head)->next, n = pos->next; pos != (head); \
213  pos = n, n = pos->next)
214 
215 #define bflb_dlist_for_each_prev_safe(pos, n, head) \
216  for (pos = (head)->prev, n = pos->prev; pos != (head); \
217  pos = n, n = pos->prev)
218 
224 #define bflb_dlist_for_each_entry(pos, head, member) \
225  for (pos = bflb_dlist_entry((head)->next, typeof(*pos), member); \
226  &pos->member != (head); \
227  pos = bflb_dlist_entry(pos->member.next, typeof(*pos), member))
228 
235 #define bflb_dlist_for_each_entry_reverse(pos, head, member) \
236  for (pos = bflb_dlist_entry((head)->prev, typeof(*pos), member); \
237  &pos->member != (head); \
238  pos = bflb_dlist_entry(pos->member.prev, typeof(*pos), member))
239 
247 #define bflb_dlist_for_each_entry_safe(pos, n, head, member) \
248  for (pos = bflb_dlist_entry((head)->next, typeof(*pos), member), \
249  n = bflb_dlist_entry(pos->member.next, typeof(*pos), member); \
250  &pos->member != (head); \
251  pos = n, n = bflb_dlist_entry(n->member.next, typeof(*n), member))
252 
260 #define bflb_dlist_for_each_entry_safe_reverse(pos, n, head, member) \
261  for (pos = bflb_dlist_entry((head)->prev, typeof(*pos), field), \
262  n = bflb_dlist_entry(pos->member.prev, typeof(*pos), member); \
263  &pos->member != (head); \
264  pos = n, n = bflb_dlist_entry(pos->member.prev, typeof(*pos), member))
265 
266 #ifdef __cplusplus
267 }
268 #endif
269 
270 #endif
static void bflb_dlist_move_tail(bflb_dlist_t *l, bflb_dlist_t *n)
move node from list.
Definition: bflb_list.h:114
static void bflb_dlist_insert_before(bflb_dlist_t *l, bflb_dlist_t *n)
insert a node before a list
Definition: bflb_list.h:79
static unsigned int bflb_dlist_len(const bflb_dlist_t *l)
get the list length
Definition: bflb_list.h:133
static void bflb_dlist_init(bflb_dlist_t *l)
initialize a list
Definition: bflb_list.h:53
struct bflb_dlist_node * prev
Definition: bflb_list.h:44
static void bflb_dlist_insert_after(bflb_dlist_t *l, bflb_dlist_t *n)
insert a node after a list
Definition: bflb_list.h:64
struct bflb_dlist_node * next
Definition: bflb_list.h:43
static void bflb_dlist_move_head(bflb_dlist_t *l, bflb_dlist_t *n)
move node from list.
Definition: bflb_list.h:104
static void bflb_dlist_remove(bflb_dlist_t *n)
remove node from list.
Definition: bflb_list.h:92
static int bflb_dlist_isempty(const bflb_dlist_t *l)
tests whether a list is empty
Definition: bflb_list.h:124