Merge pull request #634 from Tetralux/enum_from_name

Add reflect.enum_from_name
This commit is contained in:
gingerBill
2020-05-09 12:57:27 +01:00
committed by GitHub

View File

@@ -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);