Browse Source

list: fix list_prev and list_next on const lists.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rusty Russell 12 years ago
parent
commit
447cfb714c
2 changed files with 18 additions and 3 deletions
  1. 2 2
      ccan/list/list.h
  2. 16 1
      ccan/list/test/run-list_prev-list_next.c

+ 2 - 2
ccan/list/list.h

@@ -604,8 +604,8 @@ static inline struct list_node *list_node_from_off_(void *ptr, size_t off)
 #endif
 #endif
 
 
 /* Returns member, or NULL if at end of list. */
 /* 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)
 				       size_t off)
 {
 {
 	if (n == &h->n)
 	if (n == &h->n)

+ 16 - 1
ccan/list/test/run-list_prev-list_next.c

@@ -18,8 +18,10 @@ int main(int argc, char *argv[])
 {
 {
 	struct parent parent;
 	struct parent parent;
 	struct child c1, c2, c3;
 	struct child c1, c2, c3;
+	const struct parent *p;
+	const struct child *c;
 
 
-	plan_tests(12);
+	plan_tests(20);
 	parent.num_children = 0;
 	parent.num_children = 0;
 	list_head_init(&parent.children);
 	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_prev(&parent.children, &c2, list) == &c1);
 	ok1(list_next(&parent.children, &c3, list) == NULL);
 	ok1(list_next(&parent.children, &c3, list) == NULL);
 	ok1(list_prev(&parent.children, &c3, list) == &c2);
 	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();
 	return exit_status();
 }
 }