Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/adt/list.h

    r7856d09 r1023758  
    5252} list_t;
    5353
     54
     55extern bool list_member(const link_t *, const list_t *);
     56extern void list_splice(list_t *, link_t *);
     57extern unsigned long list_count(const list_t *);
     58
     59
    5460/** Declare and initialize statically allocated list.
    5561 *
     
    7076#define list_foreach(list, member, itype, iterator) \
    7177        for (itype *iterator = NULL; iterator == NULL; iterator = (itype *) 1) \
    72             for (link_t *_link = (list).head.next; \
    73             iterator = list_get_instance(_link, itype, member), \
    74             _link != &(list).head; _link = _link->next)
     78                for (link_t *_link = (list).head.next; \
     79                    iterator = list_get_instance(_link, itype, member), \
     80                    _link != &(list).head; _link = _link->next)
    7581
    7682#define list_foreach_rev(list, member, itype, iterator) \
    7783        for (itype *iterator = NULL; iterator == NULL; iterator = (itype *) 1) \
    78             for (link_t *_link = (list).head.prev; \
    79             iterator = list_get_instance(_link, itype, member), \
    80             _link != &(list).head; _link = _link->prev)
    81 
     84                for (link_t *_link = (list).head.prev; \
     85                    iterator = list_get_instance(_link, itype, member), \
     86                    _link != &(list).head; _link = _link->prev)
     87
     88/** Unlike list_foreach(), allows removing items while traversing a list.
     89 *
     90 * @code
     91 * list_t mylist;
     92 * typedef struct item {
     93 *     int value;
     94 *     link_t item_link;
     95 * } item_t;
     96 *
     97 * //..
     98 *
     99 * // Print each list element's value and remove the element from the list.
     100 * list_foreach_safe(mylist, cur_link, next_link) {
     101 *     item_t *cur_item = list_get_instance(cur_link, item_t, item_link);
     102 *     printf("%d\n", cur_item->value);
     103 *     list_remove(cur_link);
     104 * }
     105 * @endcode
     106 *
     107 * @param list List to traverse.
     108 * @param iterator Iterator to the current element of the list.
     109 *             The item this iterator points may be safely removed
     110 *             from the list.
     111 * @param next_iter Iterator to the next element of the list.
     112 */
     113#define list_foreach_safe(list, iterator, next_iter) \
     114        for (link_t *iterator = (list).head.next, \
     115            *next_iter = iterator->next; \
     116            iterator != &(list).head; \
     117            iterator = next_iter, next_iter = iterator->next)
     118
     119       
    82120#define assert_link_not_used(link) \
    83121        ASSERT(!link_used(link))
     
    182220 *
    183221 */
    184 NO_TRACE static inline int list_empty(const list_t *list)
     222NO_TRACE static inline bool list_empty(const list_t *list)
    185223{
    186224        return (list->head.next == &list->head);
     
    291329}
    292330
     331/** Concatenate two lists
     332 *
     333 * Concatenate lists @a list1 and @a list2, producing a single
     334 * list @a list1 containing items from both (in @a list1, @a list2
     335 * order) and empty list @a list2.
     336 *
     337 * @param list1         First list and concatenated output
     338 * @param list2         Second list and empty output.
     339 *
     340 */
     341NO_TRACE static inline void list_concat(list_t *list1, list_t *list2)
     342{
     343        list_splice(list2, list1->head.prev);
     344}
     345
    293346/** Get n-th item in a list.
    294347 *
     
    300353 *
    301354 */
    302 static inline link_t *list_nth(list_t *list, unsigned int n)
    303 {
    304         unsigned int cnt = 0;
     355static inline link_t *list_nth(list_t *list, unsigned long n)
     356{
     357        unsigned long cnt = 0;
    305358        link_t *link;
    306359       
     
    340393}
    341394
    342 extern int list_member(const link_t *, const list_t *);
    343 extern void list_concat(list_t *, list_t *);
    344 extern unsigned int list_count(const list_t *);
    345 
    346395#endif
    347396
Note: See TracChangeset for help on using the changeset viewer.