Changeset df29f24 in mainline for kernel/generic/include/adt/list.h
- Timestamp:
- 2011-06-01T09:04:08Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0a7627b, c9f0975
- Parents:
- e51a514 (diff), 5d1b3aa (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/adt/list.h
re51a514 rdf29f24 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 * 50 51 */ 51 52 #define LIST_INITIALIZE(name) \ 52 link_t name = { .prev = &name, .next = &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) 53 64 54 65 /** Initialize doubly-linked circular list link … … 57 68 * 58 69 * @param link Pointer to link_t structure to be initialized. 70 * 59 71 */ 60 72 NO_TRACE static inline void link_initialize(link_t *link) … … 68 80 * Initialize doubly-linked circular list. 69 81 * 70 * @param head Pointer to link_t structure representing head of the list. 71 */ 72 NO_TRACE static inline void list_initialize(link_t *head) 73 { 74 head->prev = head; 75 head->next = head; 82 * @param list Pointer to link_t structure representing the list. 83 * 84 */ 85 NO_TRACE static inline void list_initialize(link_t *list) 86 { 87 list->prev = list; 88 list->next = list; 76 89 } 77 90 … … 81 94 * 82 95 * @param link Pointer to link_t structure to be added. 83 * @param head Pointer to link_t structure representing head of the list. 84 */ 85 NO_TRACE static inline void list_prepend(link_t *link, link_t *head) 86 { 87 link->next = head->next; 88 link->prev = head; 89 head->next->prev = link; 90 head->next = link; 96 * @param list Pointer to link_t structure representing the list. 97 * 98 */ 99 NO_TRACE static inline void list_prepend(link_t *link, link_t *list) 100 { 101 link->next = list->next; 102 link->prev = list; 103 list->next->prev = link; 104 list->next = link; 91 105 } 92 106 … … 96 110 * 97 111 * @param link Pointer to link_t structure to be added. 98 * @param head Pointer to link_t structure representing head of the list. 99 */ 100 NO_TRACE static inline void list_append(link_t *link, link_t *head) 101 { 102 link->prev = head->prev; 103 link->next = head; 104 head->prev->next = link; 105 head->prev = link; 112 * @param list Pointer to link_t structure representing the list. 113 * 114 */ 115 NO_TRACE static inline void list_append(link_t *link, link_t *list) 116 { 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); 106 137 } 107 138 … … 110 141 * Remove item from doubly-linked circular list. 111 142 * 112 * @param link Pointer to link_t structure to be removed from the list it is 113 * contained in. 143 * @param link Pointer to link_t structure to be removed from the list 144 * it is contained in. 145 * 114 146 */ 115 147 NO_TRACE static inline void list_remove(link_t *link) … … 124 156 * Query emptiness of doubly-linked circular list. 125 157 * 126 * @param head Pointer to link_t structure representing head of the list. 127 */ 128 NO_TRACE static inline bool list_empty(link_t *head) 129 { 130 return head->next == head ? true : false; 131 } 132 158 * @param list Pointer to link_t structure representing the list. 159 * 160 */ 161 NO_TRACE static inline int list_empty(link_t *list) 162 { 163 return (list->next == list); 164 } 165 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 } 133 178 134 179 /** Split or concatenate headless doubly-linked circular list … … 139 184 * concatenates splitted lists and splits concatenated lists. 140 185 * 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. 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 * 145 191 */ 146 192 NO_TRACE static inline void headless_list_split_or_concat(link_t *part1, link_t *part2) 147 193 { 148 link_t *hlp;149 150 194 part1->prev->next = part2; 151 part2->prev->next = part1; 152 hlp = part1->prev; 195 part2->prev->next = part1; 196 197 link_t *hlp = part1->prev; 198 153 199 part1->prev = part2->prev; 154 200 part2->prev = hlp; 155 201 } 156 202 157 158 203 /** Split headless doubly-linked circular list 159 204 * 160 205 * Split headless doubly-linked circular list. 161 206 * 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. 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 * 166 212 */ 167 213 NO_TRACE static inline void headless_list_split(link_t *part1, link_t *part2) … … 174 220 * Concatenate two headless doubly-linked circular lists. 175 221 * 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. 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 * 178 227 */ 179 228 NO_TRACE static inline void headless_list_concat(link_t *part1, link_t *part2) … … 182 231 } 183 232 184 #define list_get_instance(link, type, member) \ 185 ((type *)(((uint8_t *)(link)) - ((uint8_t *)&(((type *)NULL)->member)))) 186 187 extern bool list_member(const link_t *link, const link_t *head); 188 extern void list_concat(link_t *head1, link_t *head2); 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 } 255 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 *); 189 259 190 260 #endif
Note:
See TracChangeset
for help on using the changeset viewer.