authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-11-18 20:18:24-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-11-18 20:18:24-05:00
log921d9c9bcba40ca07283fa3607814bb173d7af7b
treeac2ff1b7a923c8729dc22ddfc0b3042dcf2b4e3e
parent3829e200ecc251d6b55686c24bdbd579c5a2246a
signature Commit is signed but in an unrecognized format.

add std.meta.intToEnum


1 files changed, 29 insertions(+), 0 deletions(-)

std/meta/index.zig+29
......@@ -483,3 +483,32 @@ test "std.meta.eql" {
483483 debug.assert(eql(EU.tst(false), EU.tst(false)));
484484 debug.assert(!eql(EU.tst(false), EU.tst(true)));
485485}
486
487test "intToEnum with error return" {
488 const E1 = enum {
489 A,
490 };
491 const E2 = enum {
492 A,
493 B,
494 };
495
496 var zero: u8 = 0;
497 var one: u16 = 1;
498 debug.assert(intToEnum(E1, zero) catch unreachable == E1.A);
499 debug.assert(intToEnum(E2, one) catch unreachable == E2.B);
500 debug.assertError(intToEnum(E1, one), error.InvalidEnumTag);
501}
502
503pub const IntToEnumError = error{InvalidEnumTag};
504
505pub fn intToEnum(comptime Tag: type, tag_int: var) IntToEnumError!Tag {
506 comptime var i = 0;
507 inline while (i != @memberCount(Tag)) : (i += 1) {
508 const this_tag_value = @field(Tag, @memberName(Tag, i));
509 if (tag_int == @enumToInt(this_tag_value)) {
510 return this_tag_value;
511 }
512 }
513 return error.InvalidEnumTag;
514}