aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-03-19 21:05:23 +0000
committergingerBill <bill@gingerbill.org>2024-03-19 21:05:23 +0000
commita750fc0ba63c9f1461bba4cc0446b1b4c2d2b3a9 (patch)
treeb60c41fc88da2c4af2ac1b23639cdafd8e3bcf0f /core
parent433109ff52d2db76069273cd53b7aebf6aea9be0 (diff)
Add `#row_major matrix[R, C]T`
As well as `#column_major matrix[R, C]T` as an alias for just `matrix[R, C]T`. This is because some libraries require a row_major internal layout but still want to be used with row or major oriented vectors.
Diffstat (limited to 'core')
-rw-r--r--core/fmt/fmt.odin12
-rw-r--r--core/reflect/types.odin4
2 files changed, 14 insertions, 2 deletions
diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin
index 02803f882..6f9801bc8 100644
--- a/core/fmt/fmt.odin
+++ b/core/fmt/fmt.odin
@@ -2396,7 +2396,11 @@ fmt_matrix :: proc(fi: ^Info, v: any, verb: rune, info: runtime.Type_Info_Matrix
for col in 0..<info.column_count {
if col > 0 { io.write_string(fi.writer, ", ", &fi.n) }
- offset := (row + col*info.elem_stride)*info.elem_size
+ offset: int
+ switch info.layout {
+ case .Column_Major: offset = (row + col*info.elem_stride)*info.elem_size
+ case .Row_Major: offset = (col + row*info.elem_stride)*info.elem_size
+ }
data := uintptr(v.data) + uintptr(offset)
fmt_arg(fi, any{rawptr(data), info.elem.id}, verb)
@@ -2410,7 +2414,11 @@ fmt_matrix :: proc(fi: ^Info, v: any, verb: rune, info: runtime.Type_Info_Matrix
for col in 0..<info.column_count {
if col > 0 { io.write_string(fi.writer, ", ", &fi.n) }
- offset := (row + col*info.elem_stride)*info.elem_size
+ offset: int
+ switch info.layout {
+ case .Column_Major: offset = (row + col*info.elem_stride)*info.elem_size
+ case .Row_Major: offset = (col + row*info.elem_stride)*info.elem_size
+ }
data := uintptr(v.data) + uintptr(offset)
fmt_arg(fi, any{rawptr(data), info.elem.id}, verb)
diff --git a/core/reflect/types.odin b/core/reflect/types.odin
index 2b96dd4fb..9cff46a00 100644
--- a/core/reflect/types.odin
+++ b/core/reflect/types.odin
@@ -173,6 +173,7 @@ are_types_identical :: proc(a, b: ^Type_Info) -> bool {
y := b.variant.(Type_Info_Matrix) or_return
if x.row_count != y.row_count { return false }
if x.column_count != y.column_count { return false }
+ if x.layout != y.layout { return false }
return are_types_identical(x.elem, y.elem)
case Type_Info_Bit_Field:
@@ -689,6 +690,9 @@ write_type_writer :: proc(w: io.Writer, ti: ^Type_Info, n_written: ^int = nil) -
write_type(w, info.pointer, &n) or_return
case Type_Info_Matrix:
+ if info.layout == .Row_Major {
+ io.write_string(w, "#row_major ", &n) or_return
+ }
io.write_string(w, "matrix[", &n) or_return
io.write_i64(w, i64(info.row_count), 10, &n) or_return
io.write_string(w, ", ", &n) or_return