Changes in kernel/generic/include/adt/list.h [0a02653:7a0359b] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/adt/list.h
r0a02653 r7a0359b 41 41 /** Doubly linked list head and link type. */ 42 42 typedef struct link { 43 struct link *prev; 44 struct link *next; 43 struct link *prev; /**< Pointer to the previous item in the list. */ 44 struct link *next; /**< Pointer to the next item in the list. */ 45 45 } link_t; 46 46 … … 48 48 * 49 49 * @param name Name of the new statically allocated list. 50 *51 50 */ 52 51 #define LIST_INITIALIZE(name) \ 53 link_t name = { \ 54 .prev = &name, \ 55 .next = &name \ 56 } 57 58 #define list_get_instance(link, type, member) \ 59 ((type *) (((void *)(link)) - ((void *) &(((type *) NULL)->member)))) 60 61 #define list_foreach(list, iterator) \ 62 for (link_t *iterator = (list).next; \ 63 iterator != &(list); iterator = iterator->next) 52 link_t name = { .prev = &name, .next = &name } 64 53 65 54 /** Initialize doubly-linked circular list link … … 68 57 * 69 58 * @param link Pointer to link_t structure to be initialized. 70 *71 59 */ 72 60 NO_TRACE static inline void link_initialize(link_t *link) … … 80 68 * Initialize doubly-linked circular list. 81 69 * 82 * @param list Pointer to link_t structure representing the list. 83 * 70 * @param head Pointer to link_t structure representing head of the list. 84 71 */ 85 NO_TRACE static inline void list_initialize(link_t * list)72 NO_TRACE static inline void list_initialize(link_t *head) 86 73 { 87 list->prev = list;88 list->next = list;74 head->prev = head; 75 head->next = head; 89 76 } 90 77 … … 94 81 * 95 82 * @param link Pointer to link_t structure to be added. 96 * @param list Pointer to link_t structure representing the list. 97 * 83 * @param head Pointer to link_t structure representing head of the list. 98 84 */ 99 NO_TRACE static inline void list_prepend(link_t *link, link_t * list)85 NO_TRACE static inline void list_prepend(link_t *link, link_t *head) 100 86 { 101 link->next = list->next;102 link->prev = list;103 list->next->prev = link;104 list->next = link;87 link->next = head->next; 88 link->prev = head; 89 head->next->prev = link; 90 head->next = link; 105 91 } 106 92 … … 110 96 * 111 97 * @param link Pointer to link_t structure to be added. 112 * @param list Pointer to link_t structure representing the list. 113 * 98 * @param head Pointer to link_t structure representing head of the list. 114 99 */ 115 NO_TRACE static inline void list_append(link_t *link, link_t * list)100 NO_TRACE static inline void list_append(link_t *link, link_t *head) 116 101 { 117 link->prev = list->prev; 118 link->next = list; 119 list->prev->next = link; 120 list->prev = link; 121 } 122 123 /** Insert item before another item in doubly-linked circular list. 124 * 125 */ 126 static inline void list_insert_before(link_t *link, link_t *list) 127 { 128 list_append(link, list); 129 } 130 131 /** Insert item after another item in doubly-linked circular list. 132 * 133 */ 134 static inline void list_insert_after(link_t *link, link_t *list) 135 { 136 list_prepend(list, link); 102 link->prev = head->prev; 103 link->next = head; 104 head->prev->next = link; 105 head->prev = link; 137 106 } 138 107 … … 141 110 * Remove item from doubly-linked circular list. 142 111 * 143 * @param link Pointer to link_t structure to be removed from the list 144 * it is contained in. 145 * 112 * @param link Pointer to link_t structure to be removed from the list it is 113 * contained in. 146 114 */ 147 115 NO_TRACE static inline void list_remove(link_t *link) … … 156 124 * Query emptiness of doubly-linked circular list. 157 125 * 158 * @param list Pointer to link_t structure representing the list. 159 * 126 * @param head Pointer to link_t structure representing head of the list. 160 127 */ 161 NO_TRACE static inline int list_empty(link_t *list)128 NO_TRACE static inline bool list_empty(link_t *head) 162 129 { 163 return (list->next == list);130 return head->next == head ? true : false; 164 131 } 165 132 166 /** Get head item of a list.167 *168 * @param list Pointer to link_t structure representing the list.169 *170 * @return Head item of the list.171 * @return NULL if the list is empty.172 *173 */174 static inline link_t *list_head(link_t *list)175 {176 return ((list->next == list) ? NULL : list->next);177 }178 133 179 134 /** Split or concatenate headless doubly-linked circular list … … 184 139 * concatenates splitted lists and splits concatenated lists. 185 140 * 186 * @param part1 Pointer to link_t structure leading the first 187 * (half of the headless) list. 188 * @param part2 Pointer to link_t structure leading the second 189 * (half of the headless) list. 190 * 141 * @param part1 Pointer to link_t structure leading the first (half of the 142 * headless) list. 143 * @param part2 Pointer to link_t structure leading the second (half of the 144 * headless) list. 191 145 */ 192 146 NO_TRACE static inline void headless_list_split_or_concat(link_t *part1, link_t *part2) 193 147 { 148 link_t *hlp; 149 194 150 part1->prev->next = part2; 195 part2->prev->next = part1; 196 197 link_t *hlp = part1->prev; 198 151 part2->prev->next = part1; 152 hlp = part1->prev; 199 153 part1->prev = part2->prev; 200 154 part2->prev = hlp; 201 155 } 156 202 157 203 158 /** Split headless doubly-linked circular list … … 205 160 * Split headless doubly-linked circular list. 206 161 * 207 * @param part1 Pointer to link_t structure leading 208 * the first half of the headless list. 209 * @param part2 Pointer to link_t structure leading 210 * the second half of the headless list. 211 * 162 * @param part1 Pointer to link_t structure leading the first half of the 163 * headless list. 164 * @param part2 Pointer to link_t structure leading the second half of the 165 * headless list. 212 166 */ 213 167 NO_TRACE static inline void headless_list_split(link_t *part1, link_t *part2) … … 220 174 * Concatenate two headless doubly-linked circular lists. 221 175 * 222 * @param part1 Pointer to link_t structure leading 223 * the first headless list. 224 * @param part2 Pointer to link_t structure leading 225 * the second headless list. 226 * 176 * @param part1 Pointer to link_t structure leading the first headless list. 177 * @param part2 Pointer to link_t structure leading the second headless list. 227 178 */ 228 179 NO_TRACE static inline void headless_list_concat(link_t *part1, link_t *part2) … … 231 182 } 232 183 233 /** Get n-th item of a list. 234 * 235 * @param list Pointer to link_t structure representing the list. 236 * @param n Item number (indexed from zero). 237 * 238 * @return n-th item of the list. 239 * @return NULL if no n-th item found. 240 * 241 */ 242 static inline link_t *list_nth(link_t *list, unsigned int n) 243 { 244 unsigned int cnt = 0; 245 246 list_foreach(*list, link) { 247 if (cnt == n) 248 return link; 249 250 cnt++; 251 } 252 253 return NULL; 254 } 184 #define list_get_instance(link, type, member) \ 185 ((type *)(((uint8_t *)(link)) - ((uint8_t *)&(((type *)NULL)->member)))) 255 186 256 extern int list_member(const link_t *, const link_t *); 257 extern void list_concat(link_t *, link_t *); 258 extern unsigned int list_count(const link_t *); 187 extern bool list_member(const link_t *link, const link_t *head); 188 extern void list_concat(link_t *head1, link_t *head2); 259 189 260 190 #endif
Note:
See TracChangeset
for help on using the changeset viewer.