aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2018-11-18 20:18:24 -0500
committerAndrew Kelley <superjoe30@gmail.com>2018-11-18 20:18:24 -0500
commit921d9c9bcba40ca07283fa3607814bb173d7af7b (patch)
treeac2ff1b7a923c8729dc22ddfc0b3042dcf2b4e3e
parent3829e200ecc251d6b55686c24bdbd579c5a2246a (diff)
downloadzig-921d9c9bcba40ca07283fa3607814bb173d7af7b.tar.gz
zig-921d9c9bcba40ca07283fa3607814bb173d7af7b.zip
add std.meta.intToEnum
-rw-r--r--std/meta/index.zig29
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;
+}