Skip to content

Commit 5506885

Browse files
committed
Add DimAdd trait
1 parent 4a9a323 commit 5506885

File tree

3 files changed

+98
-1
lines changed

3 files changed

+98
-1
lines changed

src/dimension/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub use self::dim::*;
1818
pub use self::dimension_trait::Dimension;
1919
pub use self::dynindeximpl::IxDynImpl;
2020
pub use self::ndindex::NdIndex;
21+
pub use self::ops::DimAdd;
2122
pub use self::remove_axis::RemoveAxis;
2223

2324
use crate::shape_builder::Strides;
@@ -34,6 +35,7 @@ pub mod dim;
3435
mod dimension_trait;
3536
mod dynindeximpl;
3637
mod ndindex;
38+
mod ops;
3739
mod remove_axis;
3840

3941
/// Calculate offset from `Ix` stride converting sign properly

src/dimension/ops.rs

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

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ use std::marker::PhantomData;
134134
use alloc::sync::Arc;
135135

136136
pub use crate::dimension::dim::*;
137-
pub use crate::dimension::{Axis, AxisDescription, Dimension, IntoDimension, RemoveAxis};
137+
pub use crate::dimension::{Axis, AxisDescription, DimAdd, Dimension, IntoDimension, RemoveAxis};
138138

139139
pub use crate::dimension::IxDynImpl;
140140
pub use crate::dimension::NdIndex;

0 commit comments

Comments
 (0)