Commit be2b5277 authored by Rusty Russell's avatar Rusty Russell

tlist: use ccan/tcon

No real change for users.
parent 5c451bbb
......@@ -9,17 +9,17 @@
* this extends it so you can create list head types which only accomodate
* a specific entry type.
*
* You use TLIST_TYPE() to define the specific struct tlist_<name>, then use
* the tlist_* variants of the various list_* operations.
*
* Example:
* #include <err.h>
* #include <stdio.h>
* #include <stdlib.h>
* #include <ccan/tlist/tlist.h>
*
* // Defines struct tlist_children
* TLIST_TYPE(children, struct child);
* // We could use TLIST_TYPE(children, struct child) to define this.
* struct tlist_children {
* struct list_head raw;
* TCON(struct child *canary);
* };
* struct parent {
* const char *name;
* struct tlist_children children;
......@@ -66,6 +66,7 @@ int main(int argc, char *argv[])
if (strcmp(argv[1], "depends") == 0) {
printf("ccan/list\n");
printf("ccan/tcon\n");
return 0;
}
......
......@@ -2,8 +2,8 @@
#ifndef CCAN_TLIST_H
#define CCAN_TLIST_H
#include <ccan/list/list.h>
#include <ccan/tcon/tcon.h>
#if HAVE_FLEXIBLE_ARRAY_MEMBER
/**
* TLIST_TYPE - declare a typed list type (struct tlist)
* @suffix: the name to use (struct tlist_@suffix)
......@@ -27,31 +27,12 @@
* struct list_node list;
* };
*/
#define TLIST_TYPE(suffix, type) \
struct tlist_##suffix { \
struct list_head raw; \
const type *tcheck[]; \
#define TLIST_TYPE(suffix, type) \
struct tlist_##suffix { \
struct list_head raw; \
TCON(type *canary); \
}
/**
* tlist_raw - access the raw list inside a typed list head.
* @h: the head of the typed list (struct tlist_@suffix)
* @test_var: a pointer to the expected element type.
*
* This elaborate macro usually causes the compiler to emit a warning
* if the variable is of an unexpected type. It is used internally
* where we need to access the raw underlying list.
*/
#define tlist_raw(h, test_var) \
(sizeof((h)->tcheck[0] == (test_var)) ? &(h)->raw : &(h)->raw)
#else
#define TLIST_TYPE(suffix, type) \
struct tlist_##suffix { \
struct list_head raw; \
}
#define tlist_raw(h, test_var) (&(h)->raw)
#endif
/**
* TLIST_INIT - initalizer for an empty tlist
* @name: the name of the list.
......@@ -108,6 +89,17 @@
*/
#define tlist_init(h) list_head_init(&(h)->raw)
/**
* tlist_raw - unwrap the typed list and check the type
* @h: the tlist
* @expr: the expression to check the type against (not evaluated)
*
* This macro usually causes the compiler to emit a warning if the
* variable is of an unexpected type. It is used internally where we
* need to access the raw underlying list.
*/
#define tlist_raw(h, expr) (&tcon_check((h), canary, (expr))->raw)
/**
* tlist_add - add an entry at the start of a linked list.
* @h: the tlist to add the node to
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment