dimensioned 0.6.0

Compile-time dimensional analysis for various unit systems using Rust's type system. Dimensioned aims to build on Rust's safety features by adding unit safety with no runtime cost. In addition, it aims to be as easy to use as possible, hopefully making things easier for you not just by avoiding bugs but also by making it clear what units things are. Never again should you need to specify units in a comment!
Documentation
use core::fmt;
use typenum::Integer;

macro_rules! format_cgs_like {
    ($System:ident; $tokens:expr; $($Trait:ident)*) => (
        $(impl<V, U1, U2, U3> fmt::$Trait for $System<V, tarr![U1, U2, U3]> where
            V: fmt::$Trait, U1: Integer, U2: Integer, U3: Integer,
        {
            fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error>
            {
                // double U3 so we can treat them all the same, as sqrts
                let exponents = [U1::to_isize(), U2::to_isize(), U3::to_isize()*2];
                let print_tokens = $tokens;

                self.value_unsafe.fmt(f)?;

                let mut first = true;
                for (&exp, token) in
                    exponents.into_iter()
                    .zip(print_tokens.iter())
                {
                    if first {
                        if exp != 0 {
                            first = false;
                            write!(f, " ")?;
                        }
                    } else if exp != 0 {
                        write!(f, "*")?;
                    }

                    match exp {
                        0 => (),
                        2 => write!(f, "{}", token)?,
                        _ if exp % 2 == 0 => write!(f, "{}^{}", token, exp/2)?,
                        _ => write!(f, "{}^{}", token, (exp as f32)/2.0)?,
                    }
                }
                Ok(())
            }
        })*
    );
}

use unit_systems::cgs::CGS;
format_cgs_like!(CGS; ["cm", "g", "s"]; Display Octal LowerHex UpperHex Pointer Binary LowerExp UpperExp);

use unit_systems::mks::MKS;
format_cgs_like!(MKS; ["m", "k", "s"]; Display Octal LowerHex UpperHex Pointer Binary LowerExp UpperExp);

use unit_systems::fps::FPS;
format_cgs_like!(FPS; ["ft", "lb", "s"]; Display Octal LowerHex UpperHex Pointer Binary LowerExp UpperExp);