瀏覽代碼

encoding/cbor: support simd vectors

Laytan Laats 3 月之前
父節點
當前提交
9eefa2006e
共有 3 個文件被更改,包括 38 次插入0 次删除
  1. 18 0
      core/encoding/cbor/marshal.odin
  2. 12 0
      core/encoding/cbor/unmarshal.odin
  3. 8 0
      tests/core/encoding/cbor/test_core_cbor.odin

+ 18 - 0
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)

+ 12 - 0
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)
 	}
 }

+ 8 - 0
tests/core/encoding/cbor/test_core_cbor.odin

@@ -44,6 +44,7 @@ Foo :: struct {
 	smallest: big.Int,
 	ignore_this: ^Foo `cbor:"-"`,
 	mat: matrix[4, 4]f32,
+	vec: #simd [4]f64,
 }
 
 FooBar :: enum {
@@ -97,6 +98,7 @@ test_marshalling :: proc(t: ^testing.T) {
 			small_onetwenty = -i128(max(u64)),
 			ignore_this = &Foo{},
 			mat = 1,
+			vec = 2,
 		}
 
 		big.atoi(&f.biggest, "1234567891011121314151617181920")
@@ -145,6 +147,12 @@ test_marshalling :: proc(t: ^testing.T) {
 	"now": 1(1701117968),
 	"pos": 1212,
 	"str": "Hellope",
+	"vec": [
+		2.0000,
+		2.0000,
+		2.0000,
+		2.0000
+	],
 	"yes": true,
 	"comp": [
 		32.0000,