1 #include <ccan/typesafe_cb/typesafe_cb.h>
4 #include <ccan/tap/tap.h>
8 /* The example usage. */
9 static void _set_some_value(void *val)
14 #define set_some_value(expr) \
15 _set_some_value(cast_if_type(void *, (expr), (expr), unsigned long))
17 static void _callback_onearg(void (*fn)(void *arg), void *arg)
22 static void _callback_preargs(void (*fn)(int a, int b, void *arg), void *arg)
27 static void _callback_postargs(void (*fn)(void *arg, int a, int b), void *arg)
32 #define callback_onearg(cb, arg) \
33 _callback_onearg(typesafe_cb(void, (cb), (arg)), (arg))
35 #define callback_preargs(cb, arg) \
36 _callback_preargs(typesafe_cb_preargs(void, (cb), (arg), int, int), (arg))
38 #define callback_postargs(cb, arg) \
39 _callback_postargs(typesafe_cb_postargs(void, (cb), (arg), int, int), (arg))
41 static void my_callback_onearg(char *p)
43 ok1(strcmp(p, "hello world") == 0);
46 static void my_callback_onearg_const(const char *p)
48 ok1(strcmp(p, "hello world") == 0);
51 static void my_callback_onearg_volatile(volatile char *p)
53 /* Double cast avoids warning on gcc's -Wcast-qual */
54 ok1(strcmp((char *)(intptr_t)p, "hello world") == 0);
57 static void my_callback_preargs(int a, int b, char *p)
61 ok1(strcmp(p, "hello world") == 0);
65 static void my_callback_preargs_const(int a, int b, const char *p)
69 ok1(strcmp(p, "hello world") == 0);
72 static void my_callback_preargs_volatile(int a, int b, volatile char *p)
76 ok1(strcmp((char *)p, "hello world") == 0);
80 static void my_callback_postargs(char *p, int a, int b)
84 ok1(strcmp(p, "hello world") == 0);
88 static void my_callback_postargs_const(const char *p, int a, int b)
92 ok1(strcmp(p, "hello world") == 0);
95 static void my_callback_postargs_volatile(volatile char *p, int a, int b)
99 ok1(strcmp((char *)p, "hello world") == 0);
103 /* This is simply a compile test; we promised cast_if_type can be in a
104 * static initializer. */
105 struct callback_onearg
107 void (*fn)(void *arg);
111 struct callback_onearg cb_onearg
112 = { typesafe_cb(void, my_callback_onearg, (char *)(intptr_t)"hello world"),
115 struct callback_preargs
117 void (*fn)(int a, int b, void *arg);
121 struct callback_preargs cb_preargs
122 = { typesafe_cb_preargs(void, my_callback_preargs,
123 (char *)(intptr_t)"hi", int, int), "hi" };
125 struct callback_postargs
127 void (*fn)(void *arg, int a, int b);
131 struct callback_postargs cb_postargs
132 = { typesafe_cb_postargs(void, my_callback_postargs,
133 (char *)(intptr_t)"hi", int, int), "hi" };
135 int main(int argc, char *argv[])
138 unsigned long l = (unsigned long)p;
139 char str[] = "hello world";
141 plan_tests(2 + 3 + 3 + 3);
145 callback_onearg(my_callback_onearg, str);
146 callback_onearg(my_callback_onearg_const, str);
147 callback_onearg(my_callback_onearg_volatile, str);
149 callback_preargs(my_callback_preargs, str);
151 callback_preargs(my_callback_preargs_const, str);
152 callback_preargs(my_callback_preargs_volatile, str);
155 callback_postargs(my_callback_postargs, str);
157 callback_postargs(my_callback_postargs_const, str);
158 callback_postargs(my_callback_postargs_volatile, str);
161 return exit_status();