fn UnionTagWithoutUninitializable(T: type) type 359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376fn UnionTagWithoutUninitializable(T: type) type {
const u = @typeInfo(T).@"union";
const Tag = u.tag_type orelse @compileError("union must have tag");
const e = @typeInfo(Tag).@"enum";
var field_names: [e.field_names.len][]const u8 = undefined;
var field_values: [e.field_names.len]e.tag_type = undefined;
var n_fields = 0;
for (u.field_names, u.field_types) |f_name, f_type| {
switch (f_type) {
noreturn => continue,
else => {},
}
field_names[n_fields] = f_name;
field_values[n_fields] = @backingInt(@field(Tag, f_name));
n_fields += 1;
}
return @Enum(e.tag_type, .exhaustive, field_names[0..n_fields], field_values[0..n_fields]);
}