unitforge/quantities/
area.rs

1use crate::impl_macros::macros::*;
2use crate::prelude::*;
3use crate::quantities::*;
4use ndarray::{Array1, Array2, ArrayView1, ArrayView2};
5use num_traits::identities::Zero;
6use num_traits::FromPrimitive;
7use std::cmp::Ordering;
8use std::fmt;
9use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
10
11#[derive(Copy, Clone, PartialEq)]
12pub enum AreaUnit {
13    kmsq,
14    msq,
15    dmsq,
16    cmsq,
17    mmsq,
18    mumsq,
19    nmsq,
20}
21
22impl PhysicsUnit for AreaUnit {
23    fn name(&self) -> &str {
24        match &self {
25            AreaUnit::kmsq => "km²",
26            AreaUnit::msq => "m²",
27            AreaUnit::dmsq => "dm²",
28            AreaUnit::cmsq => "cm²",
29            AreaUnit::mmsq => "mm²",
30            AreaUnit::mumsq => "μm²",
31            AreaUnit::nmsq => "nm²",
32        }
33    }
34
35    fn base_per_x(&self) -> (f64, i32) {
36        match self {
37            AreaUnit::kmsq => (1., 6),
38            AreaUnit::msq => (1., 0),
39            AreaUnit::dmsq => (1., -2),
40            AreaUnit::cmsq => (1., -4),
41            AreaUnit::mmsq => (1., -6),
42            AreaUnit::mumsq => (1., -12),
43            AreaUnit::nmsq => (1., -18),
44        }
45    }
46}
47
48impl_quantity!(Area, AreaUnit, AreaUnit::mmsq);
49impl_div_with_self_to_f64!(Area);
50impl_sqrt!(Area, Distance);
51
52impl_mul!(Area, Stress, Force);
53impl_mul_with_self!(Area, AreaOfMoment);
54impl_div!(Area, Distance, Distance);
55impl_div!(Area, Volume, InverseDistance);