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
use approx::ApproxEq;

use alga::general::{SubsetOf, Field};

use core::{Scalar, SquareMatrix};
use core::dimension::{DimName, DimNameAdd, DimNameSum, U1};
use core::storage::OwnedStorage;
use core::allocator::OwnedAllocator;

use geometry::{TransformBase, TCategory, SuperTCategoryOf};


impl<N1, N2, D: DimName, SA, SB, C1, C2> SubsetOf<TransformBase<N2, D, SB, C2>> for TransformBase<N1, D, SA, C1>
    where N1: Scalar + Field + ApproxEq + SubsetOf<N2>,
          N2: Scalar + Field + ApproxEq,
          C1: TCategory,
          C2: SuperTCategoryOf<C1>,
          D: DimNameAdd<U1>,
          SA: OwnedStorage<N1, DimNameSum<D, U1>, DimNameSum<D, U1>>,
          SB: OwnedStorage<N2, DimNameSum<D, U1>, DimNameSum<D, U1>>,
          SA::Alloc: OwnedAllocator<N1, DimNameSum<D, U1>, DimNameSum<D, U1>, SA>,
          SB::Alloc: OwnedAllocator<N2, DimNameSum<D, U1>, DimNameSum<D, U1>, SB>,
          N1::Epsilon: Copy,
          N2::Epsilon: Copy {
    #[inline]
    fn to_superset(&self) -> TransformBase<N2, D, SB, C2> {
        TransformBase::from_matrix_unchecked(self.to_homogeneous().to_superset())
    }

    #[inline]
    fn is_in_subset(t: &TransformBase<N2, D, SB, C2>) -> bool {
        <Self as SubsetOf<_>>::is_in_subset(t.matrix())
    }

    #[inline]
    unsafe fn from_superset_unchecked(t: &TransformBase<N2, D, SB, C2>) -> Self {
        Self::from_superset_unchecked(t.matrix())
    }
}


impl<N1, N2, D: DimName, SA, SB, C> SubsetOf<SquareMatrix<N2, DimNameSum<D, U1>, SB>> for TransformBase<N1, D, SA, C>
    where N1: Scalar + Field + ApproxEq + SubsetOf<N2>,
          N2: Scalar + Field + ApproxEq,
          C: TCategory,
          D: DimNameAdd<U1>,
          SA: OwnedStorage<N1, DimNameSum<D, U1>, DimNameSum<D, U1>>,
          SB: OwnedStorage<N2, DimNameSum<D, U1>, DimNameSum<D, U1>>,
          SA::Alloc: OwnedAllocator<N1, DimNameSum<D, U1>, DimNameSum<D, U1>, SA>,
          SB::Alloc: OwnedAllocator<N2, DimNameSum<D, U1>, DimNameSum<D, U1>, SB>,
          N1::Epsilon: Copy,
          N2::Epsilon: Copy {
    #[inline]
    fn to_superset(&self) -> SquareMatrix<N2, DimNameSum<D, U1>, SB> {
        self.matrix().to_superset()
    }

    #[inline]
    fn is_in_subset(m: &SquareMatrix<N2, DimNameSum<D, U1>, SB>) -> bool {
        C::check_homogeneous_invariants(m)
    }

    #[inline]
    unsafe fn from_superset_unchecked(m: &SquareMatrix<N2, DimNameSum<D, U1>, SB>) -> Self {
        TransformBase::from_matrix_unchecked(::convert_ref_unchecked(m))
    }
}