aboutsummaryrefslogtreecommitdiff
path: root/lib/std/meta.zig
diff options
context:
space:
mode:
authorTadeo Kondrak <me@tadeo.ca>2020-08-26 12:20:27 -0600
committerTadeo Kondrak <me@tadeo.ca>2020-09-07 06:23:26 -0600
commitac19ccf5955488a43b29ea13675c33426aada430 (patch)
tree267b3685db72d1a4b568404649ab31deeddbc329 /lib/std/meta.zig
parentff2ed966bb37079217ee7a7753cb63a763b8c3b5 (diff)
downloadzig-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.zig24
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;