qtty_core/
dimension.rs

1//! Dimension types and traits.
2
3use core::marker::PhantomData;
4
5/// Marker trait for **dimensions** (Length, Time, Mass …).
6///
7/// A *dimension* is the category that distinguishes a metre from a second.
8/// You usually model each dimension as an empty enum:
9///
10/// ```rust
11/// use qtty_core::Dimension;
12/// #[derive(Debug)]
13/// pub enum Length {}
14/// impl Dimension for Length {}
15/// ```
16pub trait Dimension {}
17
18/// Dimension formed by dividing one [`Dimension`] by another.
19///
20/// This is used to model composite dimensions such as `Length/Time`
21/// for velocities or `Angular/Time` for frequencies.
22#[derive(Clone, Copy, Debug, PartialEq, Eq)]
23pub struct DivDim<N: Dimension, D: Dimension>(PhantomData<(N, D)>);
24impl<N: Dimension, D: Dimension> Dimension for DivDim<N, D> {}
25
26/// Dimension for dimensionless quantities.
27pub enum Dimensionless {}
28impl Dimension for Dimensionless {}