#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub struct MetricSignature<const P: usize, const Q: usize, const R: usize>;
impl<const P: usize, const Q: usize, const R: usize> MetricSignature<P, Q, R> {
pub const P: usize = P;
pub const Q: usize = Q;
pub const R: usize = R;
pub const DIM: usize = P + Q + R;
pub const ALGEBRA_DIM: usize = 1 << Self::DIM;
#[inline(always)]
pub const fn basis_square(i: usize) -> i8 {
if i < P {
1
} else if i < P + Q {
-1
} else if i < P + Q + R {
0
} else {
panic!("Basis index out of range for metric signature");
}
}
}
pub type SignatureEuclidean2D = MetricSignature<2, 0, 0>;
pub type SignatureEuclidean3D = MetricSignature<3, 0, 0>;
pub type SignatureMinkowski = MetricSignature<1, 3, 0>;
pub type SignaturePGA3D = MetricSignature<3, 0, 1>;
pub type SignatureCGA3D = MetricSignature<4, 1, 0>;
pub type SignatureHamilton2D = MetricSignature<0, 2, 0>;