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(typesafe_cb_cast(void *, unsigned long, (expr)))
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, void *, (cb), (arg)), (arg))
35 #define callback_preargs(cb, arg) \
36 _callback_preargs(typesafe_cb_preargs(void, void *, (cb), (arg), int, int), (arg))
38 #define callback_postargs(cb, arg) \
39 _callback_postargs(typesafe_cb_postargs(void, 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_preargs(int a, int b, char *p)
50 ok1(strcmp(p, "hello world") == 0);
53 static void my_callback_postargs(char *p, int a, int b)
57 ok1(strcmp(p, "hello world") == 0);
60 /* This is simply a compile test; we promised typesafe_cb_cast can be in a
61 * static initializer. */
62 struct callback_onearg
64 void (*fn)(void *arg);
68 struct callback_onearg cb_onearg
69 = { typesafe_cb(void, void *, my_callback_onearg, (char *)(intptr_t)"hello world"),
72 struct callback_preargs
74 void (*fn)(int a, int b, void *arg);
78 struct callback_preargs cb_preargs
79 = { typesafe_cb_preargs(void, void *, my_callback_preargs,
80 (char *)(intptr_t)"hi", int, int), "hi" };
82 struct callback_postargs
84 void (*fn)(void *arg, int a, int b);
88 struct callback_postargs cb_postargs
89 = { typesafe_cb_postargs(void, void *, my_callback_postargs,
90 (char *)(intptr_t)"hi", int, int), "hi" };
92 int main(int argc, char *argv[])
95 unsigned long l = (unsigned long)p;
96 char str[] = "hello world";
98 plan_tests(2 + 1 + 3 + 3);
102 callback_onearg(my_callback_onearg, str);
104 callback_preargs(my_callback_preargs, str);
106 callback_postargs(my_callback_postargs, str);
108 return exit_status();