authorgravatar for lucascarvalhosantos91@gmail.comLucas Santos <lucascarvalhosantos91@gmail.com> 2023-11-17 22:01:13-03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-11-18 11:24:13+02:00
logd44f822821839739c282fe325d9800ab086b456e
tree543933871d8a0fd95116d9e3f04a313875f481f4
parent91329ce9441e8711e954b91c8ae5cbc81de1c796

Faster implementation of intToEnum.


1 files changed, 13 insertions(+), 4 deletions(-)

lib/std/meta.zig+13-4
...@@ -901,11 +901,20 @@ pub fn intToEnum(comptime EnumTag: type, tag_int: anytype) IntToEnumError!EnumTa...@@ -901,11 +901,20 @@ pub fn intToEnum(comptime EnumTag: type, tag_int: anytype) IntToEnumError!EnumTa
901 return error.InvalidEnumTag;901 return error.InvalidEnumTag;
902 }902 }
903903
904 inline for (enum_info.fields) |f| {904 // We don't direcly iterate over the fields of EnumTag, as that
905 const this_tag_value = @field(EnumTag, f.name);905 // would require an inline loop. Instead, we create an array of
906 if (tag_int == @intFromEnum(this_tag_value)) {906 // values that is comptime-know, but can be iterated at runtime
907 return this_tag_value;907 // without requiring an inline loop. This generates better
908 // machine code.
909 const values = comptime blk: {
910 var result: [enum_info.fields.len]enum_info.tag_type = undefined;
911 for (&result, enum_info.fields) |*dst, src| {
912 dst.* = src.value;
908 }913 }
914 break :blk result;
915 };
916 for (values) |v| {
917 if (v == tag_int) return @enumFromInt(tag_int);
909 }918 }
910 return error.InvalidEnumTag;919 return error.InvalidEnumTag;
911}920}