1 #define NOINLINE __attribute__((noinline)) 2 #define NODISCARD [[nodiscard]] 3 4 5 #include <stdarg.h> 6 #include <stdbool.h> 7 #include <stdint.h> 8 #include <stdlib.h> 9 10 enum FillRule 11 #ifdef __cplusplus 12 : uint8_t 13 #endif // __cplusplus 14 { 15 A, 16 B, 17 }; 18 #ifndef __cplusplus 19 typedef uint8_t FillRule; 20 #endif // __cplusplus 21 22 /** 23 * This will have a destructor manually implemented via variant_body, and 24 * similarly a Drop impl in Rust. 25 */ 26 typedef struct { 27 uintptr_t len; 28 uint32_t *ptr; 29 } OwnedSlice_u32; 30 31 typedef struct { 32 FillRule fill; 33 OwnedSlice_u32 coordinates; 34 } Polygon_u32; 35 36 /** 37 * This will have a destructor manually implemented via variant_body, and 38 * similarly a Drop impl in Rust. 39 */ 40 typedef struct { 41 uintptr_t len; 42 int32_t *ptr; 43 } OwnedSlice_i32; 44 45 enum Foo_u32_Tag 46 #ifdef __cplusplus 47 : uint8_t 48 #endif // __cplusplus 49 { 50 Bar_u32, 51 Polygon1_u32, 52 Slice1_u32, 53 Slice2_u32, 54 Slice3_u32, 55 Slice4_u32, 56 }; 57 #ifndef __cplusplus 58 typedef uint8_t Foo_u32_Tag; 59 #endif // __cplusplus 60 61 typedef struct { 62 FillRule fill; 63 OwnedSlice_u32 coords; 64 } Slice3_Body_u32; 65 66 typedef struct { 67 FillRule fill; 68 OwnedSlice_i32 coords; 69 } Slice4_Body_u32; 70 71 typedef struct { 72 Foo_u32_Tag tag; 73 union { 74 struct { 75 Polygon_u32 polygon1; 76 }; 77 struct { 78 OwnedSlice_u32 slice1; 79 }; 80 struct { 81 OwnedSlice_i32 slice2; 82 }; 83 Slice3_Body_u32 slice3; 84 Slice4_Body_u32 slice4; 85 }; 86 } Foo_u32; 87 88 typedef struct { 89 FillRule fill; 90 OwnedSlice_i32 coordinates; 91 } Polygon_i32; 92 93 enum Baz_i32_Tag 94 #ifdef __cplusplus 95 : uint8_t 96 #endif // __cplusplus 97 { 98 Bar2_i32, 99 Polygon21_i32, 100 Slice21_i32, 101 Slice22_i32, 102 Slice23_i32, 103 Slice24_i32, 104 }; 105 #ifndef __cplusplus 106 typedef uint8_t Baz_i32_Tag; 107 #endif // __cplusplus 108 109 typedef struct { 110 Baz_i32_Tag tag; 111 FillRule fill; 112 OwnedSlice_i32 coords; 113 } Slice23_Body_i32; 114 115 typedef struct { 116 Baz_i32_Tag tag; 117 FillRule fill; 118 OwnedSlice_i32 coords; 119 } Slice24_Body_i32; 120 121 typedef union { 122 Baz_i32_Tag tag; 123 struct { 124 Baz_i32_Tag polygon21_tag; 125 Polygon_i32 polygon21; 126 }; 127 struct { 128 Baz_i32_Tag slice21_tag; 129 OwnedSlice_i32 slice21; 130 }; 131 struct { 132 Baz_i32_Tag slice22_tag; 133 OwnedSlice_i32 slice22; 134 }; 135 Slice23_Body_i32 slice23; 136 Slice24_Body_i32 slice24; 137 } Baz_i32; 138 139 enum Taz_Tag 140 #ifdef __cplusplus 141 : uint8_t 142 #endif // __cplusplus 143 { 144 Bar3, 145 Taz1, 146 Taz3, 147 }; 148 #ifndef __cplusplus 149 typedef uint8_t Taz_Tag; 150 #endif // __cplusplus 151 152 typedef union { 153 Taz_Tag tag; 154 struct { 155 Taz_Tag taz1_tag; 156 int32_t taz1; 157 }; 158 struct { 159 Taz_Tag taz3_tag; 160 OwnedSlice_i32 taz3; 161 }; 162 } Taz; 163 164 enum Tazz_Tag 165 #ifdef __cplusplus 166 : uint8_t 167 #endif // __cplusplus 168 { 169 Bar4, 170 Taz2, 171 }; 172 #ifndef __cplusplus 173 typedef uint8_t Tazz_Tag; 174 #endif // __cplusplus 175 176 typedef union { 177 Tazz_Tag tag; 178 struct { 179 Tazz_Tag taz2_tag; 180 int32_t taz2; 181 }; 182 } Tazz; 183 184 enum Tazzz_Tag 185 #ifdef __cplusplus 186 : uint8_t 187 #endif // __cplusplus 188 { 189 Bar5, 190 Taz5, 191 }; 192 #ifndef __cplusplus 193 typedef uint8_t Tazzz_Tag; 194 #endif // __cplusplus 195 196 typedef union { 197 Tazzz_Tag tag; 198 struct { 199 Tazzz_Tag taz5_tag; 200 int32_t taz5; 201 }; 202 } Tazzz; 203 204 enum Tazzzz_Tag 205 #ifdef __cplusplus 206 : uint8_t 207 #endif // __cplusplus 208 { 209 Taz6, 210 Taz7, 211 }; 212 #ifndef __cplusplus 213 typedef uint8_t Tazzzz_Tag; 214 #endif // __cplusplus 215 216 typedef union { 217 Tazzzz_Tag tag; 218 struct { 219 Tazzzz_Tag taz6_tag; 220 int32_t taz6; 221 }; 222 struct { 223 Tazzzz_Tag taz7_tag; 224 uint32_t taz7; 225 }; 226 } Tazzzz; 227 228 enum Qux_Tag 229 #ifdef __cplusplus 230 : uint8_t 231 #endif // __cplusplus 232 { 233 Qux1, 234 Qux2, 235 }; 236 #ifndef __cplusplus 237 typedef uint8_t Qux_Tag; 238 #endif // __cplusplus 239 240 typedef union { 241 Qux_Tag tag; 242 struct { 243 Qux_Tag qux1_tag; 244 int32_t qux1; 245 }; 246 struct { 247 Qux_Tag qux2_tag; 248 uint32_t qux2; 249 }; 250 } Qux; 251 252 #ifdef __cplusplus 253 extern "C" { 254 #endif // __cplusplus 255 256 void root(const Foo_u32 *a, 257 const Baz_i32 *b, 258 const Taz *c, 259 Tazz d, 260 const Tazzz *e, 261 const Tazzzz *f, 262 const Qux *g); 263 264 #ifdef __cplusplus 265 } // extern "C" 266 #endif // __cplusplus 267