Update package reflect

This commit is contained in:
gingerBill
2021-01-27 15:27:59 +00:00
parent 98521618e6
commit aed63a6e8b
2 changed files with 63 additions and 29 deletions
+25 -1
View File
@@ -344,7 +344,10 @@ index :: proc(val: any, i: int, loc := #caller_location) -> any {
// Struct_Tag represents the type of the string of a struct field
//
// Through convention, tags are the concatenation of optionally space separationed key:"value" pairs.
// Each key is a non-empty string which contains no control characters other than space, quotes, and colon.
Struct_Tag :: distinct string; Struct_Tag :: distinct string;
Struct_Field :: struct { Struct_Field :: struct {
@@ -352,6 +355,7 @@ Struct_Field :: struct {
type: typeid, type: typeid,
tag: Struct_Tag, tag: Struct_Tag,
offset: uintptr, offset: uintptr,
is_using: bool,
} }
struct_field_at :: proc(T: typeid, i: int) -> (field: Struct_Field) { struct_field_at :: proc(T: typeid, i: int) -> (field: Struct_Field) {
@@ -362,6 +366,7 @@ struct_field_at :: proc(T: typeid, i: int) -> (field: Struct_Field) {
field.type = s.types[i].id; field.type = s.types[i].id;
field.tag = Struct_Tag(s.tags[i]); field.tag = Struct_Tag(s.tags[i]);
field.offset = s.offsets[i]; field.offset = s.offsets[i];
field.is_using = s.usings[i];
} }
} }
return; return;
@@ -376,6 +381,7 @@ struct_field_by_name :: proc(T: typeid, name: string) -> (field: Struct_Field) {
field.type = s.types[i].id; field.type = s.types[i].id;
field.tag = Struct_Tag(s.tags[i]); field.tag = Struct_Tag(s.tags[i]);
field.offset = s.offsets[i]; field.offset = s.offsets[i];
field.is_using = s.usings[i];
break; break;
} }
} }
@@ -548,6 +554,24 @@ enum_from_name :: proc($EnumType: typeid, name: string) -> (value: EnumType, ok:
return; return;
} }
enum_from_name_any :: proc(EnumType: typeid, name: string) -> (value: runtime.Type_Info_Enum_Value, ok: bool) {
ti := runtime.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 {
continue;
}
value = eti.values[i];
ok = true;
return;
}
} else {
panic("expected enum type to reflect.enum_from_name_any");
}
return;
}
union_variant_type_info :: proc(a: any) -> ^runtime.Type_Info { union_variant_type_info :: proc(a: any) -> ^runtime.Type_Info {
id := union_variant_typeid(a); id := union_variant_typeid(a);
return type_info_of(id); return type_info_of(id);
+11 -1
View File
@@ -108,7 +108,6 @@ duration_truncate :: proc(d, m: Duration) -> Duration {
return d if m <= 0 else d - d%m; return d if m <= 0 else d - d%m;
} }
date :: proc(t: Time) -> (year: int, month: Month, day: int) { date :: proc(t: Time) -> (year: int, month: Month, day: int) {
year, month, day, _ = _abs_date(_time_abs(t), true); year, month, day, _ = _abs_date(_time_abs(t), true);
return; return;
@@ -160,6 +159,17 @@ unix :: proc(sec: i64, nsec: i64) -> Time {
return Time{(sec*1e9 + nsec) + UNIX_TO_INTERNAL}; return Time{(sec*1e9 + nsec) + UNIX_TO_INTERNAL};
} }
time_to_unix :: proc(t: Time) -> i64 {
return t._nsec/1e9;
}
time_to_unix_nano :: proc(t: Time) -> i64 {
return t._nsec;
}
time_add :: proc(t: Time, d: Duration) -> Time {
return Time{t._nsec + i64(d)};
}
ABSOLUTE_ZERO_YEAR :: i64(-292277022399); // Day is chosen so that 2001-01-01 is Monday in the calculations ABSOLUTE_ZERO_YEAR :: i64(-292277022399); // Day is chosen so that 2001-01-01 is Monday in the calculations