use core::marker::PhantomData;
use core::ops::{Add, Sub};
use typenum::Integer;
pub trait Dimension: 'static {}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Dim<L, T, M, Th, I, N, J, A>(
PhantomData<L>,
PhantomData<T>,
PhantomData<M>,
PhantomData<Th>,
PhantomData<I>,
PhantomData<N>,
PhantomData<J>,
PhantomData<A>,
)
where
L: Integer,
T: Integer,
M: Integer,
Th: Integer,
I: Integer,
N: Integer,
J: Integer,
A: Integer;
impl<L, T, M, Th, I, N, J, A> Dimension for Dim<L, T, M, Th, I, N, J, A>
where
L: Integer + 'static,
T: Integer + 'static,
M: Integer + 'static,
Th: Integer + 'static,
I: Integer + 'static,
N: Integer + 'static,
J: Integer + 'static,
A: Integer + 'static,
{
}
pub trait DimMul<Rhs: Dimension>: Dimension {
type Output: Dimension;
}
impl<L1, T1, M1, Th1, I1, N1, J1, A1, L2, T2, M2, Th2, I2, N2, J2, A2>
DimMul<Dim<L2, T2, M2, Th2, I2, N2, J2, A2>> for Dim<L1, T1, M1, Th1, I1, N1, J1, A1>
where
L1: Integer + Add<L2> + 'static,
T1: Integer + Add<T2> + 'static,
M1: Integer + Add<M2> + 'static,
Th1: Integer + Add<Th2> + 'static,
I1: Integer + Add<I2> + 'static,
N1: Integer + Add<N2> + 'static,
J1: Integer + Add<J2> + 'static,
A1: Integer + Add<A2> + 'static,
L2: Integer + 'static,
T2: Integer + 'static,
M2: Integer + 'static,
Th2: Integer + 'static,
I2: Integer + 'static,
N2: Integer + 'static,
J2: Integer + 'static,
A2: Integer + 'static,
<L1 as Add<L2>>::Output: Integer + 'static,
<T1 as Add<T2>>::Output: Integer + 'static,
<M1 as Add<M2>>::Output: Integer + 'static,
<Th1 as Add<Th2>>::Output: Integer + 'static,
<I1 as Add<I2>>::Output: Integer + 'static,
<N1 as Add<N2>>::Output: Integer + 'static,
<J1 as Add<J2>>::Output: Integer + 'static,
<A1 as Add<A2>>::Output: Integer + 'static,
{
type Output = Dim<
<L1 as Add<L2>>::Output,
<T1 as Add<T2>>::Output,
<M1 as Add<M2>>::Output,
<Th1 as Add<Th2>>::Output,
<I1 as Add<I2>>::Output,
<N1 as Add<N2>>::Output,
<J1 as Add<J2>>::Output,
<A1 as Add<A2>>::Output,
>;
}
pub trait DimDiv<Rhs: Dimension>: Dimension {
type Output: Dimension;
}
impl<L1, T1, M1, Th1, I1, N1, J1, A1, L2, T2, M2, Th2, I2, N2, J2, A2>
DimDiv<Dim<L2, T2, M2, Th2, I2, N2, J2, A2>> for Dim<L1, T1, M1, Th1, I1, N1, J1, A1>
where
L1: Integer + Sub<L2> + 'static,
T1: Integer + Sub<T2> + 'static,
M1: Integer + Sub<M2> + 'static,
Th1: Integer + Sub<Th2> + 'static,
I1: Integer + Sub<I2> + 'static,
N1: Integer + Sub<N2> + 'static,
J1: Integer + Sub<J2> + 'static,
A1: Integer + Sub<A2> + 'static,
L2: Integer + 'static,
T2: Integer + 'static,
M2: Integer + 'static,
Th2: Integer + 'static,
I2: Integer + 'static,
N2: Integer + 'static,
J2: Integer + 'static,
A2: Integer + 'static,
<L1 as Sub<L2>>::Output: Integer + 'static,
<T1 as Sub<T2>>::Output: Integer + 'static,
<M1 as Sub<M2>>::Output: Integer + 'static,
<Th1 as Sub<Th2>>::Output: Integer + 'static,
<I1 as Sub<I2>>::Output: Integer + 'static,
<N1 as Sub<N2>>::Output: Integer + 'static,
<J1 as Sub<J2>>::Output: Integer + 'static,
<A1 as Sub<A2>>::Output: Integer + 'static,
{
type Output = Dim<
<L1 as Sub<L2>>::Output,
<T1 as Sub<T2>>::Output,
<M1 as Sub<M2>>::Output,
<Th1 as Sub<Th2>>::Output,
<I1 as Sub<I2>>::Output,
<N1 as Sub<N2>>::Output,
<J1 as Sub<J2>>::Output,
<A1 as Sub<A2>>::Output,
>;
}
use typenum::{N1, N2, N3, P1, P2, P3, Z0};
pub type Dimensionless = Dim<Z0, Z0, Z0, Z0, Z0, Z0, Z0, Z0>;
pub type Length = Dim<P1, Z0, Z0, Z0, Z0, Z0, Z0, Z0>;
pub type Time = Dim<Z0, P1, Z0, Z0, Z0, Z0, Z0, Z0>;
pub type Mass = Dim<Z0, Z0, P1, Z0, Z0, Z0, Z0, Z0>;
pub type Temperature = Dim<Z0, Z0, Z0, P1, Z0, Z0, Z0, Z0>;
pub type Current = Dim<Z0, Z0, Z0, Z0, P1, Z0, Z0, Z0>;
pub type AmountOfSubstance = Dim<Z0, Z0, Z0, Z0, Z0, P1, Z0, Z0>;
pub type LuminousIntensity = Dim<Z0, Z0, Z0, Z0, Z0, Z0, P1, Z0>;
pub type Angular = Dim<Z0, Z0, Z0, Z0, Z0, Z0, Z0, P1>;
pub type Area = Dim<P2, Z0, Z0, Z0, Z0, Z0, Z0, Z0>;
pub type Volume = Dim<P3, Z0, Z0, Z0, Z0, Z0, Z0, Z0>;
pub type VelocityDim = Dim<P1, N1, Z0, Z0, Z0, Z0, Z0, Z0>;
pub type Acceleration = Dim<P1, N2, Z0, Z0, Z0, Z0, Z0, Z0>;
pub type Force = Dim<P1, N2, P1, Z0, Z0, Z0, Z0, Z0>;
pub type Energy = Dim<P2, N2, P1, Z0, Z0, Z0, Z0, Z0>;
pub type Power = Dim<P2, N3, P1, Z0, Z0, Z0, Z0, Z0>;
pub type FrequencyDim = Dim<Z0, N1, Z0, Z0, Z0, Z0, Z0, P1>;