diff options
| author | Tadeo Kondrak <me@tadeo.ca> | 2020-08-26 12:20:27 -0600 |
|---|---|---|
| committer | Tadeo Kondrak <me@tadeo.ca> | 2020-09-07 06:23:26 -0600 |
| commit | ac19ccf5955488a43b29ea13675c33426aada430 (patch) | |
| tree | 267b3685db72d1a4b568404649ab31deeddbc329 /lib/std/meta.zig | |
| parent | ff2ed966bb37079217ee7a7753cb63a763b8c3b5 (diff) | |
| download | zig-ac19ccf5955488a43b29ea13675c33426aada430.tar.gz zig-ac19ccf5955488a43b29ea13675c33426aada430.zip | |
Update standard library for removal of TypeInfo.UnionField.enum_field
Diffstat (limited to 'lib/std/meta.zig')
| -rw-r--r-- | lib/std/meta.zig | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/lib/std/meta.zig b/lib/std/meta.zig index 73e0661498..8cb1ba155d 100644 --- a/lib/std/meta.zig +++ b/lib/std/meta.zig @@ -465,10 +465,19 @@ pub fn TagPayloadType(comptime U: type, tag: @TagType(U)) type { testing.expect(trait.is(.Union)(U)); const info = @typeInfo(U).Union; + const tag_info = @typeInfo(@TagType(U)).Enum; + + comptime var name: []const u8 = undefined; + inline for (tag_info.fields) |enum_field_info| { + if (@enumToInt(tag) == enum_field_info.value) + name = enum_field_info.name; + } inline for (info.fields) |field_info| { - if (field_info.enum_field.?.value == @enumToInt(tag)) return field_info.field_type; + if (comptime mem.eql(u8, field_info.name, name)) + return field_info.field_type; } + unreachable; } @@ -504,15 +513,20 @@ pub fn eql(a: anytype, b: @TypeOf(a)) bool { } }, .Union => |info| { - if (info.tag_type) |_| { + if (info.tag_type) |Tag| { const tag_a = activeTag(a); const tag_b = activeTag(b); if (tag_a != tag_b) return false; + const tag_info = @typeInfo(Tag).Enum; inline for (info.fields) |field_info| { - const enum_field = field_info.enum_field.?; - if (enum_field.value == @enumToInt(tag_a)) { - return eql(@field(a, enum_field.name), @field(b, enum_field.name)); + comptime var tag_value: @TagType(Tag) = undefined; + inline for (tag_info.fields) |enum_field_info| { + if (comptime mem.eql(u8, field_info.name, enum_field_info.name)) + tag_value = enum_field_info.value; + } + if (tag_value == @enumToInt(tag_a)) { + return eql(@field(a, field_info.name), @field(b, field_info.name)); } } return false; |
