Skip to content

Commit d68d741

Browse files
committed
Add more binop-assign methods and reduction methods
1 parent 16feba7 commit d68d741

1 file changed

Lines changed: 49 additions & 5 deletions

File tree

src/vector.rs

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::*;
22
use num_traits::identities::ConstZero;
33
use 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

66
pub 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

Comments
 (0)