| // Copyright 2026 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| //go:build goexperiment.simd | |
| package testdata_test | |
| import ( | |
| "reflect" | |
| "simd" | |
| "simd/testdata/iface" | |
| "testing" | |
| ) | |
| func TestIFaceFoo(t *testing.T) { | |
| u := simd.BroadcastFloat32s(4) | |
| v := simd.BroadcastFloat32s(1) | |
| vc := iface.VC(v) | |
| uc := iface.VC(u) | |
| hv := iface.MakeHasFoo(vc) // generic interface w/ Foo method | |
| sum := hv.Foo(uc) | |
| s := make([]float32, u.Len()) | |
| sum.Data().Store(s) // The method of a dependent type works. | |
| if s[0] != 5 { | |
| t.Errorf("(from Data()) expected 5, got %f", s[0]) | |
| } | |
| sum.Field.Store(s) | |
| if s[0] != 5 { | |
| t.Errorf("(from Field) expected 5, got %f", s[0]) | |
| } | |
| } | |
| func TestIFaceBar(t *testing.T) { | |
| u := simd.BroadcastFloat32s(4) | |
| v := simd.BroadcastFloat32s(1) | |
| vc := iface.VC(v) | |
| uc := iface.VC(u) | |
| hv := iface.MakeHasBar(vc) // non-generic interface w/ Foo method | |
| sum := hv.Bar(uc) | |
| s := make([]float32, u.Len()) | |
| sum.Data().Store(s) // The method of a dependent type works. | |
| if s[0] != 5 { | |
| t.Errorf("(from Data()) expected 5, got %f", s[0]) | |
| } | |
| sum.Field.Store(s) | |
| if s[0] != 5 { | |
| t.Errorf("(from Field) expected 5, got %f", s[0]) | |
| } | |
| } | |
| func TestIFaceEmbedFoo(t *testing.T) { | |
| u := simd.BroadcastFloat32s(4) | |
| v := simd.BroadcastFloat32s(1) | |
| vc := iface.VC(v) | |
| uc := iface.VC(u) | |
| hv := iface.MakeHasEmbedFoo(vc) // generic interface w/ Foo method | |
| sum := hv.Foo(uc) | |
| s := make([]float32, u.Len()) | |
| sum.Data().Store(s) // The method of a dependent type works. | |
| if s[0] != 5 { | |
| t.Errorf("(from Data()) expected 5, got %f", s[0]) | |
| } | |
| sum.Field.Store(s) | |
| if s[0] != 5 { | |
| t.Errorf("(from Field) expected 5, got %f", s[0]) | |
| } | |
| rv := reflect.ValueOf(hv) | |
| rt := rv.Type() | |
| t.Logf("reflect.value is %v", rv) | |
| t.Logf("reflect.type is %v", rt) | |
| } | |
| func TestIFaceEmbedBar(t *testing.T) { | |
| u := simd.BroadcastFloat32s(4) | |
| v := simd.BroadcastFloat32s(1) | |
| vc := iface.VC(v) | |
| uc := iface.VC(u) | |
| hv := iface.MakeHasEmbedBar(vc) // generic interface w/ Foo method | |
| sum := hv.Bar(uc) | |
| s := make([]float32, u.Len()) | |
| sum.Data().Store(s) // The method of a dependent type works. | |
| if s[0] != 5 { | |
| t.Errorf("(from Data()) expected 5, got %f", s[0]) | |
| } | |
| sum.Field.Store(s) | |
| if s[0] != 5 { | |
| t.Errorf("(from Field) expected 5, got %f", s[0]) | |
| } | |
| rv := reflect.ValueOf(hv) | |
| rt := rv.Type() | |
| t.Logf("reflect.value is %v", rv) | |
| t.Logf("reflect.type is %v", rt) | |
| } | |
| func TestIFaceVL(t *testing.T) { | |
| var v simd.Int8s | |
| if a, b := iface.VL, iface.Generic[simd.Int8s](1); a != b { | |
| t.Errorf("expected iface.VL [%d] == iface.Generic[simd.Int8s](1) [%d], but not true", a, b) | |
| } | |
| if a, b := iface.VL, v.Len()+1; a != b { | |
| t.Errorf("expected iface.VL [%d] == v.Len()+1 [%d], but not true", a, b) | |
| } | |
| } |