aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2020-05-09 12:57:27 +0100
committerGitHub <noreply@github.com>2020-05-09 12:57:27 +0100
commite3f3e715e235a551dc4041a67a8876fddb4ef1b9 (patch)
treea5d038894d0746558d02b36775937a8b5afc972a
parente8f2fb58d95383f6844d23a56c8dfa495093fd7e (diff)
parent8d2430e54d40bb705499f5cfeef9fead6d9ad833 (diff)
Merge pull request #634 from Tetralux/enum_from_name
Add reflect.enum_from_name
-rw-r--r--core/reflect/reflect.odin28
1 files changed, 28 insertions, 0 deletions
diff --git a/core/reflect/reflect.odin b/core/reflect/reflect.odin
index 12428d59c..f92dc1f39 100644
--- a/core/reflect/reflect.odin
+++ b/core/reflect/reflect.odin
@@ -510,6 +510,34 @@ enum_string :: proc(a: any) -> string {
return "";
}
+// Given a enum type and a value name, get the enum value.
+enum_from_name :: proc($EnumType: typeid, name: string) -> (value: EnumType, ok: bool) {
+ ti := type_info_base(type_info_of(EnumType));
+ if eti, eti_ok := ti.variant.(runtime.Type_Info_Enum); eti_ok {
+ for value_name, i in eti.names {
+ if value_name != name do continue;
+ value_union := eti.values[i];
+ switch v in value_union {
+ case rune: value = EnumType(v); ok = true;
+ case u8: value = EnumType(v); ok = true;
+ case u16: value = EnumType(v); ok = true;
+ case u32: value = EnumType(v); ok = true;
+ case u64: value = EnumType(v); ok = true;
+ case uint: value = EnumType(v); ok = true;
+ case uintptr: value = EnumType(v); ok = true;
+ case i8: value = EnumType(v); ok = true;
+ case i16: value = EnumType(v); ok = true;
+ case i32: value = EnumType(v); ok = true;
+ case i64: value = EnumType(v); ok = true;
+ case int: value = EnumType(v); ok = true;
+ }
+ }
+ } else {
+ panic("expected enum type to reflect.enum_from_name");
+ }
+ return;
+}
+
union_variant_type_info :: proc(a: any) -> ^runtime.Type_Info {
id := union_variant_typeid(a);
return type_info_of(id);