]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[list] Add list_is_first_entry() and list_is_last_entry()
authorMichael Brown <mcb30@ipxe.org>
Sat, 24 Mar 2018 21:26:19 +0000 (21:26 +0000)
committerMichael Brown <mcb30@ipxe.org>
Sat, 24 Mar 2018 21:32:06 +0000 (21:32 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/include/ipxe/list.h
src/tests/list_test.c

index 274fb64c6f02cc2d6bd75156cf3561fad3f8169a..8de2549844823260cc19642b128d5d5887cd376e 100644 (file)
@@ -376,6 +376,28 @@ extern void extern_list_splice_tail_init ( struct list_head *list,
                                         member );              \
        ( ( &prev->member == (head) ) ? NULL : prev ); } )
 
+/**
+ * Test if entry is first in a list
+ *
+ * @v entry            List entry
+ * @v head             List head
+ * @v member           Name of list field within iterator's type
+ * @ret is_first       Entry is first in the list
+ */
+#define list_is_first_entry( entry, head, member )             \
+       ( (head)->next == &(entry)->member )
+
+/**
+ * Test if entry is last in a list
+ *
+ * @v entry            List entry
+ * @v head             List head
+ * @v member           Name of list field within iterator's type
+ * @ret is_last                Entry is last in the list
+ */
+#define list_is_last_entry( entry, head, member )              \
+       ( (head)->prev == &(entry)->member )
+
 /**
  * Iterate over a list
  *
index f016a32ebf59a501a19ba802291bfad702d21b18..d5b5c65db75760a9f715ea8a9334a65330c6f7af 100644 (file)
@@ -419,6 +419,27 @@ static void list_test_exec ( void ) {
        ok ( list_prev_entry ( &list_tests[1], list, list ) == &list_tests[5] );
        ok ( list_next_entry ( &list_tests[1], list, list ) == NULL );
 
+       /* Test list_is_first_entry() and list_is_last_entry() */
+       INIT_LIST_HEAD ( list );
+       list_add_tail ( &list_tests[4].list, list );
+       list_add_tail ( &list_tests[8].list, list );
+       list_add_tail ( &list_tests[3].list, list );
+       list_add_tail ( &list_tests[6].list, list );
+       ok ( list_is_first_entry ( &list_tests[4], list, list ) );
+       ok ( ! list_is_first_entry ( &list_tests[8], list, list ) );
+       ok ( ! list_is_first_entry ( &list_tests[3], list, list ) );
+       ok ( ! list_is_first_entry ( &list_tests[6], list, list ) );
+       ok ( ! list_is_last_entry ( &list_tests[4], list, list ) );
+       ok ( ! list_is_last_entry ( &list_tests[8], list, list ) );
+       ok ( ! list_is_last_entry ( &list_tests[3], list, list ) );
+       ok ( list_is_last_entry ( &list_tests[6], list, list ) );
+       list_del ( &list_tests[4].list );
+       ok ( list_is_first_entry ( &list_tests[8], list, list ) );
+       list_del ( &list_tests[8].list );
+       list_del ( &list_tests[6].list );
+       ok ( list_is_first_entry ( &list_tests[3], list, list ) );
+       ok ( list_is_last_entry ( &list_tests[3], list, list ) );
+
        /* Test list_for_each() */
        INIT_LIST_HEAD ( list );
        list_add_tail ( &list_tests[6].list, list );