aboutsummaryrefslogtreecommitdiff
path: root/core/encoding
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2025-06-04 21:51:12 +0200
committerLaytan Laats <laytanlaats@hotmail.com>2025-06-04 21:51:12 +0200
commit85224b21e69678923b5a514586d50730b8d823a3 (patch)
treefb1a36c84d989821114250166a519550f3fa4c7a /core/encoding
parent1a35c7f95487f75081d4c703c13bcbed335088f8 (diff)
encoding/cbor: support the matrix type
Diffstat (limited to 'core/encoding')
-rw-r--r--core/encoding/cbor/marshal.odin18
-rw-r--r--core/encoding/cbor/unmarshal.odin13
2 files changed, 31 insertions, 0 deletions
diff --git a/core/encoding/cbor/marshal.odin b/core/encoding/cbor/marshal.odin
index aca71deb2..ec597c8a9 100644
--- a/core/encoding/cbor/marshal.odin
+++ b/core/encoding/cbor/marshal.odin
@@ -612,6 +612,24 @@ _marshal_into_encoder :: proc(e: Encoder, v: any, ti: ^runtime.Type_Info) -> (er
case:
panic("unknown bit_size size")
}
+ case runtime.Type_Info_Matrix:
+ count := info.column_count * info.elem_stride
+ err_conv(_encode_u64(e, u64(count), .Array)) or_return
+
+ if impl, ok := _tag_implementations_type[info.elem.id]; ok {
+ for i in 0..<count {
+ data := uintptr(v.data) + uintptr(i*info.elem_size)
+ impl->marshal(e, any{rawptr(data), info.elem.id}) or_return
+ }
+ return
+ }
+
+ elem_ti := runtime.type_info_core(type_info_of(info.elem.id))
+ for i in 0..<count {
+ data := uintptr(v.data) + uintptr(i*info.elem_size)
+ _marshal_into_encoder(e, any{rawptr(data), info.elem.id}, elem_ti) or_return
+ }
+ return
}
return _unsupported(v.id, nil)
diff --git a/core/encoding/cbor/unmarshal.odin b/core/encoding/cbor/unmarshal.odin
index 24bbd8137..7ddc90961 100644
--- a/core/encoding/cbor/unmarshal.odin
+++ b/core/encoding/cbor/unmarshal.odin
@@ -591,6 +591,19 @@ _unmarshal_array :: proc(d: Decoder, v: any, ti: ^reflect.Type_Info, hdr: Header
if out_of_space { return _unsupported(v, hdr) }
return
+ case reflect.Type_Info_Matrix:
+ count := t.column_count * t.elem_stride
+ length, _ := err_conv(_decode_len_container(d, add)) or_return
+ if length > count {
+ return _unsupported(v, hdr)
+ }
+
+ da := mem.Raw_Dynamic_Array{rawptr(v.data), 0, length, allocator }
+
+ out_of_space := assign_array(d, &da, t.elem, length, growable=false) or_return
+ if out_of_space { return _unsupported(v, hdr) }
+ return
+
case: return _unsupported(v, hdr)
}
}