unitforge/quantities/
area.rs1use 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);