pub fn fromInt(comptime E: type, integer: anytype) ?E E: typeinteger10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27pub fn fromInt(comptime E: type, integer: anytype) ?E {
const enum_info = @typeInfo(E).@"enum";
if (enum_info.mode == .nonexhaustive) {
if (std.math.cast(enum_info.tag_type, integer)) |tag| {
return @fromBackingInt(@intCast(tag));
}
return null;
}
// We don't directly iterate over the fields of E, as that
// would require an inline loop. Instead, we create an array of
// values that is comptime-know, but can be iterated at runtime
// without requiring an inline loop.
// This generates better machine code.
for (values(E)) |value| {
if (@backingInt(value) == integer) return value;
}
return null;
}