1use crate::imp_prelude::*;
2
3pub trait DimAdd<D: Dimension>
5{
6 type Output: Dimension;
8}
9
10macro_rules! impl_dimadd_const_out_const {
11 ($lhs:expr, $rhs:expr) => {
12 impl DimAdd<Dim<[usize; $rhs]>> for Dim<[usize; $lhs]> {
13 type Output = Dim<[usize; $lhs + $rhs]>;
14 }
15 };
16}
17
18macro_rules! impl_dimadd_const_out_dyn {
19 ($lhs:expr, IxDyn) => {
20 impl DimAdd<IxDyn> for Dim<[usize; $lhs]> {
21 type Output = IxDyn;
22 }
23 };
24 ($lhs:expr, $rhs:expr) => {
25 impl DimAdd<Dim<[usize; $rhs]>> for Dim<[usize; $lhs]> {
26 type Output = IxDyn;
27 }
28 };
29}
30
31impl<D: Dimension> DimAdd<D> for Ix0
32{
33 type Output = D;
34}
35
36impl_dimadd_const_out_const!(1, 0);
37impl_dimadd_const_out_const!(1, 1);
38impl_dimadd_const_out_const!(1, 2);
39impl_dimadd_const_out_const!(1, 3);
40impl_dimadd_const_out_const!(1, 4);
41impl_dimadd_const_out_const!(1, 5);
42impl_dimadd_const_out_dyn!(1, 6);
43impl_dimadd_const_out_dyn!(1, IxDyn);
44
45impl_dimadd_const_out_const!(2, 0);
46impl_dimadd_const_out_const!(2, 1);
47impl_dimadd_const_out_const!(2, 2);
48impl_dimadd_const_out_const!(2, 3);
49impl_dimadd_const_out_const!(2, 4);
50impl_dimadd_const_out_dyn!(2, 5);
51impl_dimadd_const_out_dyn!(2, 6);
52impl_dimadd_const_out_dyn!(2, IxDyn);
53
54impl_dimadd_const_out_const!(3, 0);
55impl_dimadd_const_out_const!(3, 1);
56impl_dimadd_const_out_const!(3, 2);
57impl_dimadd_const_out_const!(3, 3);
58impl_dimadd_const_out_dyn!(3, 4);
59impl_dimadd_const_out_dyn!(3, 5);
60impl_dimadd_const_out_dyn!(3, 6);
61impl_dimadd_const_out_dyn!(3, IxDyn);
62
63impl_dimadd_const_out_const!(4, 0);
64impl_dimadd_const_out_const!(4, 1);
65impl_dimadd_const_out_const!(4, 2);
66impl_dimadd_const_out_dyn!(4, 3);
67impl_dimadd_const_out_dyn!(4, 4);
68impl_dimadd_const_out_dyn!(4, 5);
69impl_dimadd_const_out_dyn!(4, 6);
70impl_dimadd_const_out_dyn!(4, IxDyn);
71
72impl_dimadd_const_out_const!(5, 0);
73impl_dimadd_const_out_const!(5, 1);
74impl_dimadd_const_out_dyn!(5, 2);
75impl_dimadd_const_out_dyn!(5, 3);
76impl_dimadd_const_out_dyn!(5, 4);
77impl_dimadd_const_out_dyn!(5, 5);
78impl_dimadd_const_out_dyn!(5, 6);
79impl_dimadd_const_out_dyn!(5, IxDyn);
80
81impl_dimadd_const_out_const!(6, 0);
82impl_dimadd_const_out_dyn!(6, 1);
83impl_dimadd_const_out_dyn!(6, 2);
84impl_dimadd_const_out_dyn!(6, 3);
85impl_dimadd_const_out_dyn!(6, 4);
86impl_dimadd_const_out_dyn!(6, 5);
87impl_dimadd_const_out_dyn!(6, 6);
88impl_dimadd_const_out_dyn!(6, IxDyn);
89
90impl<D: Dimension> DimAdd<D> for IxDyn
91{
92 type Output = IxDyn;
93}