authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2022-01-17 17:50:23-08:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-01-20 10:54:45+02:00
logb7ba728929df7a7e2fde11004c6cb8d1575b8514
treecf3bb10fcfaffce3ff1943a48934292677a2f490
parent5eaac2fb99ad7357eb7bf2451adcaeec4108aec3

std: add meta.DeclEnum


1 files changed, 41 insertions(+), 0 deletions(-)

lib/std/meta.zig+41
......@@ -594,6 +594,47 @@ test "std.meta.FieldEnum" {
594594 try expectEqualEnum(enum { a, b, c }, FieldEnum(union { a: u8, b: void, c: f32 }));
595595}
596596
597pub fn DeclEnum(comptime T: type) type {
598 const fieldInfos = std.meta.declarations(T);
599 var enumDecls: [fieldInfos.len]std.builtin.TypeInfo.EnumField = undefined;
600 var decls = [_]std.builtin.TypeInfo.Declaration{};
601 inline for (fieldInfos) |field, i| {
602 enumDecls[i] = .{ .name = field.name, .value = i };
603 }
604 return @Type(.{
605 .Enum = .{
606 .layout = .Auto,
607 .tag_type = std.math.IntFittingRange(0, fieldInfos.len - 1),
608 .fields = &enumDecls,
609 .decls = &decls,
610 .is_exhaustive = true,
611 },
612 });
613}
614
615test "std.meta.DeclEnum" {
616 const A = struct {
617 const a: u8 = 0;
618 };
619 const B = union {
620 foo: void,
621
622 const a: u8 = 0;
623 const b: void = {};
624 const c: f32 = 0;
625 };
626 const C = enum {
627 bar,
628
629 const a: u8 = 0;
630 const b: void = {};
631 const c: f32 = 0;
632 };
633 try expectEqualEnum(enum { a }, DeclEnum(A));
634 try expectEqualEnum(enum { a, b, c }, DeclEnum(B));
635 try expectEqualEnum(enum { a, b, c }, DeclEnum(C));
636}
637
597638pub const TagType = @compileError("deprecated; use Tag");
598639
599640pub fn Tag(comptime T: type) type {