include: add list_last_entry to get the tail of a list

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
This commit is contained in:
Peter Hutterer 2011-12-01 14:12:11 +10:00
parent 6acebf9e12
commit c8e451a8e7
2 changed files with 21 additions and 0 deletions

View File

@ -262,6 +262,21 @@ list_is_empty(struct list *head)
#define list_first_entry(ptr, type, member) \
list_entry((ptr)->next, type, member)
/**
* Retrieve the last list entry for the given listpointer.
*
* Example:
* struct foo *first;
* first = list_last_entry(&foo->mylist, struct foo, mylist);
*
* @param ptr The list head
* @param type Data type of the list element to retrieve
* @param member Member name of the struct list field in the list element.
* @return A pointer to the last list element.
*/
#define list_last_entry(ptr, type, member) \
list_entry((ptr)->prev, type, member)
#define __container_of(ptr, sample, member) \
(void *)((char *)(ptr) \
- ((char *)&(sample)->member - (char *)(sample)))

View File

@ -103,14 +103,20 @@ test_list_append(void)
c = list_first_entry(&parent.children, struct child, node);
assert(memcmp(c, &child[0], sizeof(struct child)) == 0);
c = list_last_entry(&parent.children, struct child, node);
assert(memcmp(c, &child[0], sizeof(struct child)) == 0);
list_append(&child[1].node, &parent.children);
c = list_first_entry(&parent.children, struct child, node);
assert(memcmp(c, &child[0], sizeof(struct child)) == 0);
c = list_last_entry(&parent.children, struct child, node);
assert(memcmp(c, &child[1], sizeof(struct child)) == 0);
list_append(&child[2].node, &parent.children);
c = list_first_entry(&parent.children, struct child, node);
assert(memcmp(c, &child[0], sizeof(struct child)) == 0);
c = list_last_entry(&parent.children, struct child, node);
assert(memcmp(c, &child[2], sizeof(struct child)) == 0);
i = 0;
list_for_each_entry(c, &parent.children, node) {