diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2018-11-18 20:18:24 -0500 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2018-11-18 20:18:24 -0500 |
| commit | 921d9c9bcba40ca07283fa3607814bb173d7af7b (patch) | |
| tree | ac2ff1b7a923c8729dc22ddfc0b3042dcf2b4e3e /std | |
| parent | 3829e200ecc251d6b55686c24bdbd579c5a2246a (diff) | |
| download | zig-921d9c9bcba40ca07283fa3607814bb173d7af7b.tar.gz zig-921d9c9bcba40ca07283fa3607814bb173d7af7b.zip | |
add std.meta.intToEnum
Diffstat (limited to 'std')
| -rw-r--r-- | std/meta/index.zig | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/std/meta/index.zig b/std/meta/index.zig index 20e66fbe3d..2019543b54 100644 --- a/std/meta/index.zig +++ b/std/meta/index.zig @@ -483,3 +483,32 @@ test "std.meta.eql" { debug.assert(eql(EU.tst(false), EU.tst(false))); debug.assert(!eql(EU.tst(false), EU.tst(true))); } + +test "intToEnum with error return" { + const E1 = enum { + A, + }; + const E2 = enum { + A, + B, + }; + + var zero: u8 = 0; + var one: u16 = 1; + debug.assert(intToEnum(E1, zero) catch unreachable == E1.A); + debug.assert(intToEnum(E2, one) catch unreachable == E2.B); + debug.assertError(intToEnum(E1, one), error.InvalidEnumTag); +} + +pub const IntToEnumError = error{InvalidEnumTag}; + +pub fn intToEnum(comptime Tag: type, tag_int: var) IntToEnumError!Tag { + comptime var i = 0; + inline while (i != @memberCount(Tag)) : (i += 1) { + const this_tag_value = @field(Tag, @memberName(Tag, i)); + if (tag_int == @enumToInt(this_tag_value)) { + return this_tag_value; + } + } + return error.InvalidEnumTag; +} |
