-
Notifications
You must be signed in to change notification settings - Fork 0
/
vec16.go
87 lines (68 loc) · 2.14 KB
/
vec16.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package fluentvec
import "github.com/duncanpierce/vector/constraintsExt"
type (
Vector16[Element constraintsExt.Number] [16]Element
Masked16[Element constraintsExt.Number] struct {
vector *Vector16[Element]
predicate Predicate
setToZero bool
}
)
func (v *Vector16[Element]) Blend(p Predicate) Masked16[Element] {
return Masked16[Element]{vector: v, predicate: p, setToZero: false}
}
func (v *Vector16[Element]) Zero(p Predicate) Masked16[Element] {
return Masked16[Element]{vector: v, predicate: p, setToZero: true}
}
func (v *Vector16[Element]) All() Masked16[Element] {
return Masked16[Element]{vector: v, predicate: All(), setToZero: false}
}
func (v Masked16[Element]) Blend(p Predicate) Masked16[Element] {
return Masked16[Element]{vector: v.vector, predicate: p, setToZero: false}
}
func (v Masked16[Element]) Zero(p Predicate) Masked16[Element] {
return Masked16[Element]{vector: v.vector, predicate: p, setToZero: true}
}
func (v Masked16[Element]) All() Masked16[Element] {
return Masked16[Element]{vector: v.vector, predicate: All(), setToZero: false}
}
/////
func Assign16[Element constraintsExt.Number](v *[16]Element) Masked16[Element] {
return Masked16[Element]{vector: (*Vector16[Element])(v), predicate: All(), setToZero: false}
}
/////
func Broadcast16[Element constraintsExt.Number](v Element) *Vector16[Element] {
r := Vector16[Element]{}
for i := range r {
r[i] = v
}
return &r
}
/////
func (v Masked16[Element]) ForRange(f func(i int)) Masked16[Element] {
if v.setToZero {
*v.vector = Vector16[Element]{}
}
v.predicate.ForRange(16, f)
return v
}
func (v Masked16[Element]) Add(a, b *Vector16[Element]) Masked16[Element] {
return v.ForRange(func(i int) {
v.vector[i] = a[i] + b[i]
})
}
func (v Masked16[Element]) Sub(a, b *Vector16[Element]) Masked16[Element] {
return v.ForRange(func(i int) {
v.vector[i] = a[i] - b[i]
})
}
func (v Masked16[Element]) Mul(a, b *Vector16[Element]) Masked16[Element] {
return v.ForRange(func(i int) {
v.vector[i] = a[i] * b[i]
})
}
func (v Masked16[Element]) Div(a, b *Vector16[Element]) Masked16[Element] {
return v.ForRange(func(i int) {
v.vector[i] = a[i] / b[i]
})
}