mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 23:58:50 +00:00
encoding/cbor: support the matrix type
This commit is contained in:
@@ -612,6 +612,24 @@ _marshal_into_encoder :: proc(e: Encoder, v: any, ti: ^runtime.Type_Info) -> (er
|
|||||||
case:
|
case:
|
||||||
panic("unknown bit_size size")
|
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)
|
return _unsupported(v.id, nil)
|
||||||
|
|||||||
@@ -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) }
|
if out_of_space { return _unsupported(v, hdr) }
|
||||||
return
|
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)
|
case: return _unsupported(v, hdr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ Foo :: struct {
|
|||||||
biggest: big.Int,
|
biggest: big.Int,
|
||||||
smallest: big.Int,
|
smallest: big.Int,
|
||||||
ignore_this: ^Foo `cbor:"-"`,
|
ignore_this: ^Foo `cbor:"-"`,
|
||||||
|
mat: matrix[4, 4]f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
FooBar :: enum {
|
FooBar :: enum {
|
||||||
@@ -95,6 +96,7 @@ test_marshalling :: proc(t: ^testing.T) {
|
|||||||
onetwenty = i128(12345),
|
onetwenty = i128(12345),
|
||||||
small_onetwenty = -i128(max(u64)),
|
small_onetwenty = -i128(max(u64)),
|
||||||
ignore_this = &Foo{},
|
ignore_this = &Foo{},
|
||||||
|
mat = 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
big.atoi(&f.biggest, "1234567891011121314151617181920")
|
big.atoi(&f.biggest, "1234567891011121314151617181920")
|
||||||
@@ -120,6 +122,24 @@ test_marshalling :: proc(t: ^testing.T) {
|
|||||||
defer delete(diagnosis)
|
defer delete(diagnosis)
|
||||||
testing.expect_value(t, diagnosis, `{
|
testing.expect_value(t, diagnosis, `{
|
||||||
"no": null,
|
"no": null,
|
||||||
|
"mat": [
|
||||||
|
1.0000,
|
||||||
|
0.0000,
|
||||||
|
0.0000,
|
||||||
|
0.0000,
|
||||||
|
0.0000,
|
||||||
|
1.0000,
|
||||||
|
0.0000,
|
||||||
|
0.0000,
|
||||||
|
0.0000,
|
||||||
|
0.0000,
|
||||||
|
1.0000,
|
||||||
|
0.0000,
|
||||||
|
0.0000,
|
||||||
|
0.0000,
|
||||||
|
0.0000,
|
||||||
|
1.0000
|
||||||
|
],
|
||||||
"neg": -69,
|
"neg": -69,
|
||||||
"nos": undefined,
|
"nos": undefined,
|
||||||
"now": 1(1701117968),
|
"now": 1(1701117968),
|
||||||
|
|||||||
Reference in New Issue
Block a user