include: add list_append()
The existing list_add() prepends to the list, but in some cases we need the list ordered in the way we append the elements. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
This commit is contained in:
		
							parent
							
								
									fb22a408c6
								
							
						
					
					
						commit
						6acebf9e12
					
				|  | @ -159,6 +159,28 @@ list_add(struct list *entry, struct list *head) | |||
|     __list_add(entry, head, head->next); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Append a new element to the end of the list given with this list head. | ||||
|  * | ||||
|  * The list changes from: | ||||
|  *      head → some element → ... → lastelement | ||||
|  * to | ||||
|  *      head → some element → ... → lastelement → new element | ||||
|  * | ||||
|  * Example: | ||||
|  * struct foo *newfoo = malloc(...); | ||||
|  * list_append(&newfoo->mylist, &foo->mylist); | ||||
|  * | ||||
|  * @param entry The new element to prepend to the list. | ||||
|  * @param head The existing list. | ||||
|  */ | ||||
| static inline void | ||||
| list_append(struct list *entry, struct list *head) | ||||
| { | ||||
|     __list_add(entry, head->prev, head); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static inline void | ||||
| __list_del(struct list *prev, struct list *next) | ||||
| { | ||||
|  |  | |||
							
								
								
									
										31
									
								
								test/list.c
								
								
								
								
							
							
						
						
									
										31
									
								
								test/list.c
								
								
								
								
							|  | @ -88,6 +88,36 @@ test_list_add(void) | |||
|     assert(memcmp(c, &child[2], sizeof(struct child)) == 0); | ||||
| }; | ||||
| 
 | ||||
| static void | ||||
| test_list_append(void) | ||||
| { | ||||
|     struct parent parent = {0}; | ||||
|     struct child child[3]; | ||||
|     struct child *c; | ||||
|     int i; | ||||
| 
 | ||||
|     list_init(&parent.children); | ||||
| 
 | ||||
|     list_append(&child[0].node, &parent.children); | ||||
|     assert(!list_is_empty(&parent.children)); | ||||
| 
 | ||||
|     c = list_first_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); | ||||
| 
 | ||||
|     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); | ||||
| 
 | ||||
|     i = 0; | ||||
|     list_for_each_entry(c, &parent.children, node) { | ||||
|         assert(memcmp(c, &child[i++], sizeof(struct child)) == 0); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| static void | ||||
| test_list_del(void) | ||||
| { | ||||
|  | @ -325,6 +355,7 @@ int main(int argc, char** argv) | |||
| { | ||||
|     test_list_init(); | ||||
|     test_list_add(); | ||||
|     test_list_append(); | ||||
|     test_list_del(); | ||||
|     test_list_for_each(); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue