Changes in kernel/generic/include/adt/list.h [e98f1c3e:b76ce3f] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/adt/list.h
re98f1c3e rb76ce3f 37 37 #define KERN_LIST_H_ 38 38 39 #include <debug.h> 40 #include <typedefs.h> 39 #include <assert.h> 40 #include <stdbool.h> 41 #include <stddef.h> 41 42 #include <trace.h> 42 43 … … 52 53 } list_t; 53 54 54 55 55 extern bool list_member(const link_t *, const list_t *); 56 56 extern void list_splice(list_t *, link_t *); 57 57 extern unsigned long list_count(const list_t *); 58 58 59 60 59 /** Declare and initialize statically allocated list. 61 60 * … … 64 63 */ 65 64 #define LIST_INITIALIZE(name) \ 66 list_t name = { \ 65 list_t name = LIST_INITIALIZER(name) 66 67 /** Initializer for statically allocated list. 68 * 69 * @code 70 * struct named_list { 71 * const char *name; 72 * list_t list; 73 * } var = { 74 * .name = "default name", 75 * .list = LIST_INITIALIZER(name_list.list) 76 * }; 77 * @endcode 78 * 79 * @param name Name of the new statically allocated list. 80 * 81 */ 82 #define LIST_INITIALIZER(name) \ 83 { \ 67 84 .head = { \ 68 85 .prev = &(name).head, \ … … 87 104 88 105 /** Unlike list_foreach(), allows removing items while traversing a list. 89 * 106 * 90 107 * @code 91 108 * list_t mylist; … … 117 134 iterator = next_iter, next_iter = iterator->next) 118 135 119 120 136 #define assert_link_not_used(link) \ 121 ASSERT(!link_used(link)) 137 assert(!link_used(link)) 138 139 /** Returns true if the link is definitely part of a list. False if not sure. */ 140 static inline bool link_in_use(const link_t *link) 141 { 142 return link->prev != NULL && link->next != NULL; 143 } 122 144 123 145 /** Initialize doubly-linked circular list link … … 246 268 * 247 269 */ 248 static inline link_t *list_last( list_t *list)249 { 250 return ( (list->head.prev == &list->head) ? NULL : list->head.prev);270 static inline link_t *list_last(const list_t *list) 271 { 272 return (list->head.prev == &list->head) ? NULL : list->head.prev; 251 273 } 252 274 … … 258 280 * @return Next item or NULL if @a link is the last item. 259 281 */ 260 static inline link_t *list_next( link_t *link, const list_t *list)282 static inline link_t *list_next(const link_t *link, const list_t *list) 261 283 { 262 284 return (link->next == &list->head) ? NULL : link->next; … … 270 292 * @return Previous item or NULL if @a link is the first item. 271 293 */ 272 static inline link_t *list_prev( link_t *link, const list_t *list)294 static inline link_t *list_prev(const link_t *link, const list_t *list) 273 295 { 274 296 return (link->prev == &list->head) ? NULL : link->prev; … … 353 375 * 354 376 */ 355 static inline link_t *list_nth( list_t *list, unsigned long n)377 static inline link_t *list_nth(const list_t *list, unsigned long n) 356 378 { 357 379 unsigned long cnt = 0; 358 link_t *link;359 380 360 link = list_first(list);381 link_t *link = list_first(list); 361 382 while (link != NULL) { 362 383 if (cnt == n) … … 389 410 return false; 390 411 391 ASSERT(link->prev != NULL && link->next != NULL);412 assert(link->prev != NULL && link->next != NULL); 392 413 return true; 393 414 }
Note:
See TracChangeset
for help on using the changeset viewer.