list: fix list_prev and list_next on const lists.
authorRusty Russell <rusty@rustcorp.com.au>
Sat, 9 Nov 2013 10:16:58 +0000 (20:46 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Sat, 9 Nov 2013 10:16:58 +0000 (20:46 +1030)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ccan/list/list.h
ccan/list/test/run-list_prev-list_next.c

index 03614873ef6a718aaaadec32a27356f82c6c7912..3153d550824b9b8dd7940b02e4bb414cbffb2aa9 100644 (file)
@@ -604,8 +604,8 @@ static inline struct list_node *list_node_from_off_(void *ptr, size_t off)
 #endif
 
 /* Returns member, or NULL if at end of list. */
-static inline void *list_entry_or_null(struct list_head *h,
-                                      struct list_node *n,
+static inline void *list_entry_or_null(const struct list_head *h,
+                                      const struct list_node *n,
                                       size_t off)
 {
        if (n == &h->n)
index 85611d9d74863d0f1cd841040fcd2085ccc797fd..b496f11f84d8bea54191be4ff4069882be5aa3f9 100644 (file)
@@ -18,8 +18,10 @@ int main(int argc, char *argv[])
 {
        struct parent parent;
        struct child c1, c2, c3;
+       const struct parent *p;
+       const struct child *c;
 
-       plan_tests(12);
+       plan_tests(20);
        parent.num_children = 0;
        list_head_init(&parent.children);
 
@@ -46,5 +48,18 @@ int main(int argc, char *argv[])
        ok1(list_prev(&parent.children, &c2, list) == &c1);
        ok1(list_next(&parent.children, &c3, list) == NULL);
        ok1(list_prev(&parent.children, &c3, list) == &c2);
+
+       /* Const variants */
+       p = &parent;
+       c = &c2;
+       ok1(list_next(&p->children, &c1, list) == &c2);
+       ok1(list_prev(&p->children, &c1, list) == NULL);
+       ok1(list_next(&p->children, c, list) == &c3);
+       ok1(list_prev(&p->children, c, list) == &c1);
+       ok1(list_next(&parent.children, c, list) == &c3);
+       ok1(list_prev(&parent.children, c, list) == &c1);
+       ok1(list_next(&p->children, &c3, list) == NULL);
+       ok1(list_prev(&p->children, &c3, list) == &c2);
+
        return exit_status();
 }