diff options
Diffstat (limited to 'core/encoding')
| -rw-r--r-- | core/encoding/cbor/marshal.odin | 18 | ||||
| -rw-r--r-- | core/encoding/cbor/unmarshal.odin | 12 |
2 files changed, 30 insertions, 0 deletions
diff --git a/core/encoding/cbor/marshal.odin b/core/encoding/cbor/marshal.odin index ec597c8a9..b23087c90 100644 --- a/core/encoding/cbor/marshal.odin +++ b/core/encoding/cbor/marshal.odin @@ -630,6 +630,24 @@ _marshal_into_encoder :: proc(e: Encoder, v: any, ti: ^runtime.Type_Info) -> (er _marshal_into_encoder(e, any{rawptr(data), info.elem.id}, elem_ti) or_return } return + + case runtime.Type_Info_Simd_Vector: + err_conv(_encode_u64(e, u64(info.count), .Array)) or_return + + if impl, ok := _tag_implementations_type[info.elem.id]; ok { + for i in 0..<info.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..<info.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 7ddc90961..365ac5d6f 100644 --- a/core/encoding/cbor/unmarshal.odin +++ b/core/encoding/cbor/unmarshal.odin @@ -604,6 +604,18 @@ _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_Simd_Vector: + length, _ := err_conv(_decode_len_container(d, add)) or_return + if length > t.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) } } |