Double dispatch visitor
[libside.git] / src / test.c
1 // SPDX-License-Identifier: MIT
2 /*
3 * Copyright 2022 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 */
5
6 #include <stdint.h>
7 #include <inttypes.h>
8 #include <stdlib.h>
9 #include <stdio.h>
10
11 #include <side/trace.h>
12 #include "tracer.h"
13
14 /* User code example */
15
16 static side_define_event(my_provider_event, "myprovider", "myevent", SIDE_LOGLEVEL_DEBUG,
17 side_field_list(
18 side_field(SIDE_TYPE_U32, "abc"),
19 side_field(SIDE_TYPE_S64, "def"),
20 side_field(SIDE_TYPE_DYNAMIC, "dynamic"),
21 )
22 );
23
24 static
25 void test_fields(void)
26 {
27 uint32_t uw = 42;
28 int64_t sdw = -500;
29
30 my_provider_event.enabled = 1;
31 side_event(&my_provider_event, side_arg_list(side_arg_u32(uw), side_arg_s64(sdw), side_arg_string("zzz")));
32 }
33
34 static side_define_event(my_provider_event2, "myprovider", "myevent2", SIDE_LOGLEVEL_DEBUG,
35 side_field_list(
36 side_field_struct("structfield",
37 side_field_list(
38 side_field(SIDE_TYPE_U32, "x"),
39 side_field(SIDE_TYPE_S64, "y"),
40 )
41 ),
42 side_field(SIDE_TYPE_U8, "z"),
43 )
44 );
45
46 static
47 void test_struct(void)
48 {
49 my_provider_event2.enabled = 1;
50 side_event_cond(&my_provider_event2) {
51 side_arg_define_vec(mystruct, side_arg_list(side_arg_u32(21), side_arg_s64(22)));
52 side_event_call(&my_provider_event2, side_arg_list(side_arg_struct(&mystruct), side_arg_u8(55)));
53 }
54 }
55
56 static side_define_event(my_provider_event_array, "myprovider", "myarray", SIDE_LOGLEVEL_DEBUG,
57 side_field_list(
58 side_field_array("arr", side_elem(SIDE_TYPE_U32), 3),
59 side_field(SIDE_TYPE_S64, "v"),
60 )
61 );
62
63 static
64 void test_array(void)
65 {
66 my_provider_event_array.enabled = 1;
67 side_event_cond(&my_provider_event_array) {
68 side_arg_define_vec(myarray, side_arg_list(side_arg_u32(1), side_arg_u32(2), side_arg_u32(3)));
69 side_event_call(&my_provider_event_array, side_arg_list(side_arg_array(&myarray), side_arg_s64(42)));
70 }
71 }
72
73 static side_define_event(my_provider_event_vla, "myprovider", "myvla", SIDE_LOGLEVEL_DEBUG,
74 side_field_list(
75 side_field_vla("vla", side_elem(SIDE_TYPE_U32)),
76 side_field(SIDE_TYPE_S64, "v"),
77 )
78 );
79
80 static
81 void test_vla(void)
82 {
83 my_provider_event_vla.enabled = 1;
84 side_event_cond(&my_provider_event_vla) {
85 side_arg_define_vec(myvla, side_arg_list(side_arg_u32(1), side_arg_u32(2), side_arg_u32(3)));
86 side_event_call(&my_provider_event_vla, side_arg_list(side_arg_vla(&myvla), side_arg_s64(42)));
87 }
88 }
89
90 struct app_visitor_ctx {
91 const uint32_t *ptr;
92 uint32_t length;
93 };
94
95 static
96 enum side_visitor_status test_visitor(const struct side_tracer_visitor_ctx *tracer_ctx, void *_ctx)
97 {
98 struct app_visitor_ctx *ctx = (struct app_visitor_ctx *) _ctx;
99 uint32_t length = ctx->length, i;
100
101 for (i = 0; i < length; i++) {
102 const struct side_arg_vec elem = {
103 .type = SIDE_TYPE_U32,
104 .u = {
105 .side_u32 = ctx->ptr[i],
106 },
107 };
108 tracer_ctx->write_elem(tracer_ctx, &elem);
109 }
110 return SIDE_VISITOR_STATUS_OK;
111 }
112
113 static uint32_t testarray[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
114
115 static side_define_event(my_provider_event_vla_visitor, "myprovider", "myvlavisit", SIDE_LOGLEVEL_DEBUG,
116 side_field_list(
117 side_field_vla_visitor("vlavisit", side_elem(SIDE_TYPE_U32), test_visitor),
118 side_field(SIDE_TYPE_S64, "v"),
119 )
120 );
121
122 static
123 void test_vla_visitor(void)
124 {
125 my_provider_event_vla_visitor.enabled = 1;
126 side_event_cond(&my_provider_event_vla_visitor) {
127 struct app_visitor_ctx ctx = {
128 .ptr = testarray,
129 .length = SIDE_ARRAY_SIZE(testarray),
130 };
131 side_event_call(&my_provider_event_vla_visitor, side_arg_list(side_arg_vla_visitor(&ctx), side_arg_s64(42)));
132 }
133 }
134
135 static int64_t array_fixint[] = { -444, 555, 123, 2897432587 };
136
137 static side_define_event(my_provider_event_array_fixint, "myprovider", "myarrayfixint", SIDE_LOGLEVEL_DEBUG,
138 side_field_list(
139 side_field_array("arrfixint", side_elem(SIDE_TYPE_S64), SIDE_ARRAY_SIZE(array_fixint)),
140 side_field(SIDE_TYPE_S64, "v"),
141 )
142 );
143
144 static
145 void test_array_fixint(void)
146 {
147 my_provider_event_array_fixint.enabled = 1;
148 side_event(&my_provider_event_array_fixint,
149 side_arg_list(side_arg_array_s64(array_fixint), side_arg_s64(42)));
150 }
151
152 static int64_t vla_fixint[] = { -444, 555, 123, 2897432587 };
153
154 static side_define_event(my_provider_event_vla_fixint, "myprovider", "myvlafixint", SIDE_LOGLEVEL_DEBUG,
155 side_field_list(
156 side_field_vla("vlafixint", side_elem(SIDE_TYPE_S64)),
157 side_field(SIDE_TYPE_S64, "v"),
158 )
159 );
160
161 static
162 void test_vla_fixint(void)
163 {
164 my_provider_event_vla_fixint.enabled = 1;
165 side_event(&my_provider_event_vla_fixint,
166 side_arg_list(side_arg_vla_s64(vla_fixint, SIDE_ARRAY_SIZE(vla_fixint)), side_arg_s64(42)));
167 }
168
169 int main()
170 {
171 test_fields();
172 test_struct();
173 test_array();
174 test_vla();
175 test_vla_visitor();
176 test_array_fixint();
177 test_vla_fixint();
178 return 0;
179 }
This page took 0.033952 seconds and 5 git commands to generate.