use crate::algebra::{
abstr::{Field, Scalar},
linear::vector::Vector,
};
use std::ops::Sub;
impl<T> Sub<Vector<T>> for Vector<T>
where
T: Field + Scalar,
{
type Output = Vector<T>;
fn sub(self, rhs: Vector<T>) -> Self::Output {
Vector {
data: self.data.sub(rhs.data),
}
}
}
impl<'a, T> Sub<&'a Vector<T>> for &Vector<T>
where
T: Field + Scalar,
{
type Output = Vector<T>;
fn sub(self, rhs: &'a Vector<T>) -> Self::Output {
Vector {
data: (&self.data).sub(&rhs.data),
}
}
}
impl<'a, 'b, T> Sub<&'b Vector<T>> for &'a mut Vector<T>
where
T: Field + Scalar,
{
type Output = &'a mut Vector<T>;
fn sub(self, rhs: &'b Vector<T>) -> Self::Output {
let _ = &mut self.data - &rhs.data;
self
}
}
impl<T> Sub<T> for Vector<T>
where
T: Field + Scalar,
{
type Output = Vector<T>;
fn sub(mut self, rhs: T) -> Self::Output {
self.data = (&self.data).sub(&rhs);
self
}
}
impl<T> Sub<&T> for &Vector<T>
where
T: Field + Scalar,
{
type Output = Vector<T>;
fn sub(self, rhs: &T) -> Self::Output {
Vector {
data: (&self.data).sub(rhs),
}
}
}
impl<'a, T> Sub<&T> for &'a mut Vector<T>
where
T: Field + Scalar,
{
type Output = &'a mut Vector<T>;
fn sub(self, rhs: &T) -> Self::Output {
let _ = &mut self.data - rhs;
self
}
}