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