11use super :: * ;
22use num_traits:: identities:: ConstZero ;
33use std:: fmt:: Debug ;
4- use std:: ops:: { Add , Div , Index , Mul , Neg , Sub } ;
4+ use std:: ops:: { Add , AddAssign , Div , DivAssign , Index , Mul , MulAssign , Neg , Sub , SubAssign } ;
55
66pub trait SimdVector : Sized {
77 type LaneType : Sized + ConstZero + Copy + Debug + PartialEq + PartialOrd ;
@@ -86,6 +86,27 @@ macro_rules! impl_simd_vec_universal_methods {
8686 pub fn dot( self , other: $name) -> $lane_ty {
8787 ( self . 0 * other. 0 ) . reduce_sum( )
8888 }
89+ #[ inline]
90+ pub fn reduce_sum( self ) -> $lane_ty {
91+ self . 0 . reduce_sum( )
92+ }
93+ #[ inline]
94+ pub fn reduce_product( self ) -> $lane_ty {
95+ self . 0 . reduce_product( )
96+ }
97+ }
98+ impl Mul <$lane_ty> for $name {
99+ type Output = $name;
100+ #[ inline]
101+ fn mul( self , rhs: $lane_ty) -> Self :: Output {
102+ $name( self . 0 * <$simd_ty>:: splat( rhs) )
103+ }
104+ }
105+ impl MulAssign <$lane_ty> for $name {
106+ #[ inline]
107+ fn mul_assign( & mut self , rhs: $lane_ty) {
108+ self . 0 *= <$simd_ty>:: splat( rhs) ;
109+ }
89110 }
90111 impl Mul <$name> for $name {
91112 type Output = $name;
@@ -95,11 +116,10 @@ macro_rules! impl_simd_vec_universal_methods {
95116 $name( self . 0 * rhs. 0 )
96117 }
97118 }
98- impl Mul <$lane_ty> for $name {
99- type Output = $name;
119+ impl MulAssign <$name> for $name {
100120 #[ inline]
101- fn mul ( self , rhs: $lane_ty ) -> Self :: Output {
102- $name ( self . 0 * <$simd_ty> :: splat ( rhs) )
121+ fn mul_assign ( & mut self , rhs: $name ) {
122+ self . 0 *= rhs. 0 ;
103123 }
104124 }
105125 impl Div <$lane_ty> for $name {
@@ -109,6 +129,12 @@ macro_rules! impl_simd_vec_universal_methods {
109129 $name( self . 0 / <$simd_ty>:: splat( rhs) )
110130 }
111131 }
132+ impl DivAssign <$lane_ty> for $name {
133+ #[ inline]
134+ fn div_assign( & mut self , rhs: $lane_ty) {
135+ self . 0 /= <$simd_ty>:: splat( rhs) ;
136+ }
137+ }
112138 impl Div <$name> for $name {
113139 type Output = $name;
114140 /// Element-wise division
@@ -117,20 +143,38 @@ macro_rules! impl_simd_vec_universal_methods {
117143 $name( self . 0 / rhs. 0 )
118144 }
119145 }
146+ impl DivAssign <$name> for $name {
147+ #[ inline]
148+ fn div_assign( & mut self , rhs: $name) {
149+ self . 0 /= rhs. 0 ;
150+ }
151+ }
120152 impl Add <$name> for $name {
121153 type Output = $name;
122154 #[ inline]
123155 fn add( self , rhs: $name) -> Self :: Output {
124156 $name( self . 0 + rhs. 0 )
125157 }
126158 }
159+ impl AddAssign <$name> for $name {
160+ #[ inline]
161+ fn add_assign( & mut self , rhs: $name) {
162+ self . 0 += rhs. 0 ;
163+ }
164+ }
127165 impl Sub <$name> for $name {
128166 type Output = $name;
129167 #[ inline]
130168 fn sub( self , rhs: $name) -> Self :: Output {
131169 $name( self . 0 - rhs. 0 )
132170 }
133171 }
172+ impl SubAssign <$name> for $name {
173+ #[ inline]
174+ fn sub_assign( & mut self , rhs: $name) {
175+ self . 0 -= rhs. 0 ;
176+ }
177+ }
134178 impl $name {
135179 pub fn elementwise_min( self , other: $name) -> $name {
136180 $name( self . 0 . simd_min( other. 0 ) )
0 commit comments