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
use crate::{
    dim::DimTrait,
    matrix::{ToViewMatrix, ViewMutMatix},
    matrix_impl::Matrix,
    memory_impl::{ViewMem, ViewMutMem},
    num::Num,
};

use super::{add::MatrixAddAssign, copy_from::CopyFrom};

pub trait MatrixSubAssign<Rhs>: ViewMutMatix {
    fn sub_assign(self, rhs: Rhs);
}

pub trait MatrixSub<Lhs, Rhs>: ViewMutMatix {
    fn sub(self, lhs: Lhs, rhs: Rhs);
}

impl<'a, 'b, T, D1, D2> MatrixSubAssign<Matrix<ViewMem<'a, T>, D1>>
    for Matrix<ViewMutMem<'b, T>, D2>
where
    D1: DimTrait,
    D2: DimTrait,
    T: Num,
{
    fn sub_assign(self, rhs: Matrix<ViewMem<T>, D1>) {
        let rhs = rhs * T::minus_one();
        MatrixAddAssign::add_assign(self, rhs.to_view());
    }
}

impl<'a, T, D> MatrixSubAssign<T> for Matrix<ViewMutMem<'a, T>, D>
where
    D: DimTrait,
    T: Num,
{
    fn sub_assign(self, rhs: T) {
        let rhs = rhs * T::minus_one();
        MatrixAddAssign::add_assign(self, rhs);
    }
}

impl<'a, 'b, 'c, T, D1, D2, D3> MatrixSub<Matrix<ViewMem<'a, T>, D1>, Matrix<ViewMem<'b, T>, D2>>
    for Matrix<ViewMutMem<'c, T>, D3>
where
    D1: DimTrait,
    D2: DimTrait,
    D3: DimTrait,
    T: Num,
{
    fn sub(self, lhs: Matrix<ViewMem<T>, D1>, rhs: Matrix<ViewMem<T>, D2>) {
        let mut self_ = self.into_dyn_dim();
        let lhs = lhs.into_dyn_dim();
        CopyFrom::copy_from(&mut self_, &lhs);
        let rhs = rhs * T::minus_one();
        MatrixSubAssign::sub_assign(self_, rhs.to_view());
    }
}

impl<'a, 'b, T, D1, D2> MatrixSub<Matrix<ViewMem<'a, T>, D1>, T> for Matrix<ViewMutMem<'b, T>, D2>
where
    D1: DimTrait,
    D2: DimTrait,
    T: Num,
{
    fn sub(self, lhs: Matrix<ViewMem<T>, D1>, rhs: T) {
        let mut self_ = self.into_dyn_dim();
        let lhs = lhs.into_dyn_dim();
        CopyFrom::copy_from(&mut self_, &lhs);
        let rhs = rhs * T::minus_one();
        MatrixSubAssign::sub_assign(self_, rhs);
    }
}