Browse Source

Fix polymorphic matrix element with a minor hack

gingerBill 3 years ago
parent
commit
80bd1eb615
2 changed files with 15 additions and 4 deletions
  1. 4 4
      core/math/linalg/general.odin
  2. 11 0
      src/check_type.cpp

+ 4 - 4
core/math/linalg/general.odin

@@ -287,10 +287,10 @@ array_cast :: proc(v: $A/[$N]$T, $Elem_Type: typeid) -> (w: [N]Elem_Type) #no_bo
 	return
 }
 
-matrix_cast :: proc(v: $A/[$M][$N]$T, $Elem_Type: typeid) -> (w: [M][N]Elem_Type) #no_bounds_check {
-	for i in 0..<M {
-		for j in 0..<N {
-			w[i][j] = Elem_Type(v[i][j])
+matrix_cast :: proc(v: $A/matrix[$M, $N]$T, $Elem_Type: typeid) -> (w: matrix[M, N]Elem_Type) #no_bounds_check {
+	for j in 0..<N {
+		for i in 0..<M {
+			w[i, j] = Elem_Type(v[i, j])
 		}
 	}
 	return

+ 11 - 0
src/check_type.cpp

@@ -2284,10 +2284,21 @@ void check_matrix_type(CheckerContext *ctx, Type **type, Ast *node) {
 	}
 	
 	if (!is_type_valid_for_matrix_elems(elem)) {
+		if (elem == t_typeid) {
+			Entity *e = entity_of_node(mt->elem);
+			if (e && e->kind == Entity_TypeName && e->TypeName.is_type_alias) {
+				// HACK TODO(bill): This is to allow polymorphic parameters for matrix elements
+				// proc($T: typeid) -> matrix[2, 2]T
+				//
+				// THIS IS NEEDS TO BE FIXED AND NOT USE THIS HACK
+				goto type_assign;
+			}
+		}
 		gbString s = type_to_string(elem);
 		error(column.expr, "Matrix elements types are limited to integers, floats, and complex, got %s", s);
 		gb_string_free(s);
 	}
+type_assign:;
 	
 	*type = alloc_type_matrix(elem, row_count, column_count, generic_row, generic_column);