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:
parent
6acebf9e12
commit
c8e451a8e7
|
@ -262,6 +262,21 @@ list_is_empty(struct list *head)
|
||||||
#define list_first_entry(ptr, type, member) \
|
#define list_first_entry(ptr, type, member) \
|
||||||
list_entry((ptr)->next, 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) \
|
#define __container_of(ptr, sample, member) \
|
||||||
(void *)((char *)(ptr) \
|
(void *)((char *)(ptr) \
|
||||||
- ((char *)&(sample)->member - (char *)(sample)))
|
- ((char *)&(sample)->member - (char *)(sample)))
|
||||||
|
|
|
@ -103,14 +103,20 @@ test_list_append(void)
|
||||||
|
|
||||||
c = list_first_entry(&parent.children, struct child, node);
|
c = list_first_entry(&parent.children, struct child, node);
|
||||||
assert(memcmp(c, &child[0], sizeof(struct child)) == 0);
|
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);
|
list_append(&child[1].node, &parent.children);
|
||||||
c = list_first_entry(&parent.children, struct child, node);
|
c = list_first_entry(&parent.children, struct child, node);
|
||||||
assert(memcmp(c, &child[0], sizeof(struct child)) == 0);
|
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);
|
list_append(&child[2].node, &parent.children);
|
||||||
c = list_first_entry(&parent.children, struct child, node);
|
c = list_first_entry(&parent.children, struct child, node);
|
||||||
assert(memcmp(c, &child[0], sizeof(struct child)) == 0);
|
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;
|
i = 0;
|
||||||
list_for_each_entry(c, &parent.children, node) {
|
list_for_each_entry(c, &parent.children, node) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user