use core::dimension::{Dim, DimName, Dynamic}; /// A type for enforcing constraints. pub struct ShapeConstraint; /// Constraints `C1` and `R2` to be equivalent. pub trait AreMultipliable { } impl AreMultipliable for ShapeConstraint where ShapeConstraint: DimEq { } macro_rules! equality_trait_decl( ($($Trait: ident),* $(,)*) => {$( // XXX: we can't do something like `DimEq for D2` because we would require a blancket impl… pub trait $Trait { type Representative: Dim; } impl $Trait for ShapeConstraint { type Representative = D; } impl $Trait for ShapeConstraint { type Representative = D; } impl $Trait for ShapeConstraint { type Representative = D; } )*} ); equality_trait_decl!(DimEq, SameNumberOfRows, SameNumberOfColumns); /// Constraints D1 and D2 to be equivalent, where the both designates dimensions of algebraic /// entities (e.g. square matrices). pub trait SameDimension: SameNumberOfRows + SameNumberOfColumns { type Representative: Dim; } impl SameDimension for ShapeConstraint { type Representative = D; } impl SameDimension for ShapeConstraint { type Representative = D; } impl SameDimension for ShapeConstraint { type Representative = D; }