unitforge 0.2.26

A library for unit and quantity consistent computations in Rust
Documentation
use crate::impl_macros::macros::*;
use crate::prelude::*;
use crate::quantities::*;
use ndarray::{Array1, Array2, ArrayView1, ArrayView2};
use num_traits::identities::Zero;
use num_traits::FromPrimitive;
#[cfg(feature = "pyo3")]
use pyo3::pyclass;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use std::cmp::Ordering;
use std::fmt;
use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};

#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Copy, Clone, PartialEq, Debug)]
#[cfg_attr(feature = "pyo3", pyclass(eq, eq_int))]
pub enum VolumeUnit {
    kmcb,
    mcb,
    dmcb,
    l,
    cmcb,
    mmcb,
    mumcb,
    incb,
    ftcb,
    ydcb,
    impgal,
}

impl PhysicsUnit for VolumeUnit {
    fn name(&self) -> &str {
        match self {
            VolumeUnit::kmcb => "km³",
            VolumeUnit::mcb => "",
            VolumeUnit::dmcb => "dm³",
            VolumeUnit::l => "l",
            VolumeUnit::cmcb => "cm³",
            VolumeUnit::mmcb => "mm³",
            VolumeUnit::mumcb => "μm³",
            VolumeUnit::incb => "in³",
            VolumeUnit::ftcb => "ft³",
            VolumeUnit::ydcb => "yd³",
            VolumeUnit::impgal => "imp gal",
        }
    }

    fn base_per_x(&self) -> (f64, i32) {
        match self {
            VolumeUnit::kmcb => (1.0, 9),
            VolumeUnit::mcb => (1.0, 0),
            VolumeUnit::dmcb => (1.0, -3),
            VolumeUnit::l => (1.0, -3),
            VolumeUnit::cmcb => (1.0, -6),
            VolumeUnit::mmcb => (1.0, -9),
            VolumeUnit::mumcb => (1.0, -18),
            VolumeUnit::incb => (1.6387064, -5),
            VolumeUnit::ftcb => (2.8316846592, -2),
            VolumeUnit::ydcb => (7.64554857984, -1),
            VolumeUnit::impgal => (3.78541, -3),
        }
    }
}

impl_quantity!(Volume, VolumeUnit, VolumeUnit::dmcb);
impl_div_with_self_to_f64!(Volume);
impl_mul!(Volume, Density, Mass);
impl_mul!(Volume, Distance, AreaOfMoment);
impl_div!(Volume, Distance, Area);
impl_div!(Volume, Area, Distance);
impl_div!(Volume, Mass, Density);
impl_div!(Volume, ForceArea, Compliance);