use super::{Float, Matrix}; use crate::{ColumnVector, RowVector, VectorImpl}; use core::ops; impl ops::Add<&VectorImpl> for VectorImpl { type Output = Option>; fn add(self, other: &VectorImpl) -> Self::Output { self.add_to(other) } } impl ops::Sub<&VectorImpl> for VectorImpl { type Output = Option>; fn sub(self, other: &VectorImpl) -> Self::Output { self.subtract(other) } } impl ops::Mul for VectorImpl { type Output = VectorImpl; fn mul(self, scalar: T) -> Self::Output { self.scale(scalar) } } impl ops::Div for VectorImpl { type Output = VectorImpl; fn div(self, scalar: T) -> Self::Output { self.scale(T::one() / scalar) } } impl ops::AddAssign> for VectorImpl { fn add_assign(&mut self, other: VectorImpl) { if let Some(result) = self.add_to(&other) { *self = result; } } } impl ops::SubAssign> for VectorImpl { fn sub_assign(&mut self, other: VectorImpl) { if let Some(result) = self.subtract(&other) { *self = result; } } } impl ops::MulAssign for VectorImpl { fn mul_assign(&mut self, scalar: T) { *self = self.scale(scalar); } } impl ops::DivAssign for VectorImpl { fn div_assign(&mut self, scalar: T) { *self = self.scale(T::one() / scalar); } } impl ops::Mul<&Matrix> for RowVector { type Output = Option>; fn mul(self, matrix: &Matrix) -> Self::Output { self.mul_matrix(matrix) } } impl ops::Mul<&Matrix> for ColumnVector { type Output = Option>; fn mul(self, matrix: &Matrix) -> Self::Output { self.mul_matrix(matrix) } } impl ops::MulAssign<&Matrix> for RowVector { fn mul_assign(&mut self, matrix: &Matrix) { if let Some(result) = self.mul_matrix(matrix) { *self = result; } } } impl ops::MulAssign<&Matrix> for ColumnVector { fn mul_assign(&mut self, matrix: &Matrix) { if let Some(result) = self.mul_matrix(matrix) { *self = result; } } }