Browse Source

Add a few more reflect.bit_field_* helpers.

Jeroen van Rijn 11 months ago
parent
commit
8ad4427a25
1 changed files with 68 additions and 23 deletions
  1. 68 23
      core/reflect/reflect.odin

+ 68 - 23
core/reflect/reflect.odin

@@ -1015,6 +1015,74 @@ bit_set_is_big_endian :: proc(value: any, loc := #caller_location) -> bool {
 }
 }
 
 
 
 
+Bit_Field :: struct {
+	name:   string,
+	type:   ^Type_Info,
+	size:   uintptr,     // Size in bits
+	offset: uintptr,     // Offset in bits
+	tag:    Struct_Tag,
+}
+
+@(require_results)
+bit_fields_zipped :: proc(T: typeid) -> (fields: #soa[]Bit_Field) {
+	ti := runtime.type_info_base(type_info_of(T))
+	if s, ok := ti.variant.(runtime.Type_Info_Bit_Field); ok {
+		return soa_zip(
+			name   = s.names[:s.field_count],
+			type   = s.types[:s.field_count],
+			size   = s.bit_sizes[:s.field_count],
+			offset = s.bit_offsets[:s.field_count],
+			tag      = ([^]Struct_Tag)(s.tags)[:s.field_count],
+		)
+	}
+	return nil
+}
+
+@(require_results)
+bit_field_names :: proc(T: typeid) -> []string {
+	ti := runtime.type_info_base(type_info_of(T))
+	if s, ok := ti.variant.(runtime.Type_Info_Bit_Field); ok {
+		return s.names[:s.field_count]
+	}
+	return nil
+}
+
+@(require_results)
+bit_field_types :: proc(T: typeid) -> []^Type_Info {
+	ti := runtime.type_info_base(type_info_of(T))
+	if s, ok := ti.variant.(runtime.Type_Info_Bit_Field); ok {
+		return s.types[:s.field_count]
+	}
+	return nil
+}
+
+@(require_results)
+bit_field_sizes :: proc(T: typeid) -> []uintptr {
+	ti := runtime.type_info_base(type_info_of(T))
+	if s, ok := ti.variant.(runtime.Type_Info_Bit_Field); ok {
+		return s.bit_sizes[:s.field_count]
+	}
+	return nil
+}
+
+@(require_results)
+bit_field_offsets :: proc(T: typeid) -> []uintptr {
+	ti := runtime.type_info_base(type_info_of(T))
+	if s, ok := ti.variant.(runtime.Type_Info_Bit_Field); ok {
+		return s.bit_offsets[:s.field_count]
+	}
+	return nil
+}
+
+@(require_results)
+bit_field_tags :: proc(T: typeid) -> []Struct_Tag {
+	ti := runtime.type_info_base(type_info_of(T))
+	if s, ok := ti.variant.(runtime.Type_Info_Bit_Field); ok {
+		return transmute([]Struct_Tag)s.tags[:s.field_count]
+	}
+	return nil
+}
+
 @(require_results)
 @(require_results)
 as_bool :: proc(a: any) -> (value: bool, valid: bool) {
 as_bool :: proc(a: any) -> (value: bool, valid: bool) {
 	if a == nil { return }
 	if a == nil { return }
@@ -1698,27 +1766,4 @@ equal :: proc(a, b: any, including_indirect_array_recursion := false, recursion_
 	runtime.print_typeid(a.id)
 	runtime.print_typeid(a.id)
 	runtime.print_string("\n")
 	runtime.print_string("\n")
 	return true
 	return true
-}
-
-Bit_Field :: struct {
-	name:   string,
-	type:   ^Type_Info,
-	size:   uintptr,
-	offset: uintptr,
-	tag:    Struct_Tag,
-}
-
-@(require_results)
-bit_fields_zipped :: proc(T: typeid) -> (fields: #soa[]Bit_Field) {
-	ti := runtime.type_info_base(type_info_of(T))
-	if s, ok := ti.variant.(runtime.Type_Info_Bit_Field); ok {
-		return soa_zip(
-			name   = s.names[:s.field_count],
-			type   = s.types[:s.field_count],
-			size   = s.bit_sizes[:s.field_count],
-			offset = s.bit_offsets[:s.field_count],
-			tag      = ([^]Struct_Tag)(s.tags)[:s.field_count],
-		)
-	}
-	return nil
 }
 }